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变量没有我不想删除的上述注释。
我怎样才能做到这一点?
使用较新版本的 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)
| 归档时间: |
|
| 查看次数: |
11752 次 |
| 最近记录: |