Sed 删除所有包含 ROLE {rolename} 的行

Sed to remove all lines containing ROLE {rolename}

提问人:armchair 提问时间:9/20/2023 最后编辑:armchair 更新时间:9/21/2023 访问量:52

问:

CREATE ROLE "postgres";
ALTER ROLE "postgres" WITH  INHERIT;
CREATE ROLE postgres;
ALTER ROLE postgres WITH  INHERIT;
CREATE ROLE "postgres-123";
ALTER ROLE "postgres-123" WITH  INHERIT;

输出应为:

CREATE ROLE "postgres-123";
ALTER ROLE "postgres-123" WITH  INHERIT;

编写一个 sed 命令来就地编辑文件,以删除所有出现的行 contains(postgres 可以带或不带双引号)ROLE postgres

sed -i -E "/ROLE postgres\\b/d" file_name删除行,但不删除双引号中的行。ROLE postgrespostgres

正则表达式 SED

评论

2赞 Cyrus 9/20/2023
请编辑您的问题,并为该示例输入添加所需的输出(无描述)。
0赞 shellter 9/20/2023
3-5行样本数据应该足够了,对吧?只需包括每个应删除的案例中的一个和不应删除的一条记录。您的规范模棱两可,“lines contains ROLE postgres” 。“包含”与“(完全)匹配”不同,因此您可能需要向教师咨询所需的匹配范围。他们在这里试图教什么,规范准确性或匹配单词的“短”版本与长版本的意外后果(-;?!祝你好运!
1赞 armchair 9/20/2023
@shellter进行了必要的更改

答:

0赞 Barmar 9/20/2023 #1
sed -i -r '/ROLE "? *postgres\b/d' filename
  • "?= 可选双引号
  • *= 任意数量的空格,包括 0
  • postgress\b = postgres后跟单词边界
0赞 Ed Morton 9/21/2023 #2
$ sed -E '/ROLE (postgres|"postgres")/d' file
CREATE ROLE "postgres-123";
ALTER ROLE "postgres-123" WITH  INHERIT;

添加或以其他方式在完成测试后更新输入文件。-i

如果这不能达到您想要的效果,请编辑您的问题,以包括在您的示例输入/输出中不起作用的情况。