找到文本时从文件中删除多行

Chr*_*s G 5 command-line bash grep sed

我已经看到使用sedor删除一行的多个答案grep,但我需要搜索一行,删除该行和 2 行。例如,在文件中~/.profile我有这样的行:

#Set environment variable
export NAME=value
# (blank line here)
Run Code Online (Sandbox Code Playgroud)

所以我想搜索#Set environment variable并删除它,然后删除下一行export NAME=variable(内容应该无关紧要)和下面的空行。该export变量名是动态的,但评论将始终是相同的。可能还有其他export变量没有我不想删除的上述注释。

我怎样才能做到这一点?

hee*_*ayl 5

使用较新版本的 GNU sed(随 Ubuntu 一起提供),您可以逐字匹配换行符:

sed -z 's/#Set environment variable\nexport [^\n]\+\n\n//g' file.txt
Run Code Online (Sandbox Code Playgroud)
  • -z选项会将输入文件的行视为以 ASCII NUL 而不是换行符终止,因此我们可以\n用来匹配新行

  • #Set environment variable\n 将匹配第一行(带新行)

  • export [^\n]\+\n 将匹配以开头的第二行 export

  • 由于第三行是空白的\n就行了

  • 然后我们用空白替换整个模式以保留所需的部分

如果您想用修改后的内容覆盖文件:

sed -zi.bak 's/#Set environment variable\nexport [^\n]\+\n\n//g' file.txt
Run Code Online (Sandbox Code Playgroud)

原始文件将保留为file.txt.bak,如果您不希望使用sed -zi.

这是一个测试:

$ cat file.txt 
#Set environment variable
export NAME=value
#some text

#Set environment variable
export NAME=value

check
value

export some=value

#Set environment variable
export NAME=value

foo bar



$ sed -z 's/#Set environment variable\nexport [^\n]\+\n\n//g' file.txt 
#Set environment variable
export NAME=value
#some text

check
value

export some=value

foo bar
Run Code Online (Sandbox Code Playgroud)