使用sed匹配包含换行符的字符串

Rom*_*cea 8 linux bash ubuntu awk sed

我有一个像这样的字符串:

    #
    pap
Run Code Online (Sandbox Code Playgroud)

基本上转换为a \t#\n\tpap,我想用以下内容替换它:

    #
    pap
    python
Run Code Online (Sandbox Code Playgroud)

转化为\t#\n\tpap\n\tpython.

sed在很多方面试过这个但是它不起作用可能是因为sed以不同的方式使用新的线条.我尝试过:

sed -i "s/\t#\n\tpap/\t#\tpython\n\tpap/" /etc/freeradius/sites-available/default
Run Code Online (Sandbox Code Playgroud)

...以及许多不同的其他方式,没有结果.我知道在这种情况下如何更换?

pot*_*ong 6

这可能适合你(GNU sed):

sed '/^\t#$/{n;/^\tpap$/{p;s//\tpython/}}' file
Run Code Online (Sandbox Code Playgroud)

如果一行仅包含\t#打印它,那么如果下一行仅包含\tpap打印它,那么用该行替换\tpython并打印它.


Ken*_*ent 5

用 gawk 试试这一行:

awk -v RS="\0" -v ORS="" '{gsub(/\t#\n\tpap/,"yourNEwString")}7' file
Run Code Online (Sandbox Code Playgroud)

如果你想让sed 处理新行,你必须先阅读整个文件:

sed ':a;N;$!ba;s/\t#\n\tpap/NewString/g' file
Run Code Online (Sandbox Code Playgroud)

  • +` 用于 awk 解决方案。我忽略了 sed 一个,所以我可以 +1 awk 一个 :-)。顺便说一句,我最近发现有人解析包含 `NUL` 字符的文本文件,因此使用 `RS='\0'` 对他们不起作用,所以我默认切换到使用 `RS='^$' ` 并说明它只是呆呆的。`^$` 有效是因为这 2 个字符与字符串的开头和结尾匹配,并且 gawk 将输入文件视为要拆分为记录的字符串,因此 `RS='^$'` 仅适用于空字符串/文件并且不能存在于具有任何内容的文件中。如果他们不能傻眼,那么接下来我提到的警告是“RS='\0'”。 (2认同)
  • “gsub”后面的“7”代表什么? (2认同)