如何阻止换行符转义OLD gnu sed命令

时间:2015-06-23 20:16:01

标签: linux bash sed

我正在尝试用多行替换文件中的一行。当我只有一个新行char(\' $' \ n)时。它工作正常,但是当我使用其中两个时,它会逃脱我的sed并且文件不再运行。

sed 's/TextImLookingFor/My\'$'\nReplacement\'$'\nText/g' /path/to/File.txt

FILE.TXT:

This is a file
TextImLookingFor
look at all this text

DesiredOutput

This is a file
My
Replacement
Text
look at all this text

实际输出

unexpected EOF while looking for matching ''''
syntax error: unexpected end of file

3 个答案:

答案 0 :(得分:3)

使用旧的BSD sed,您可以:

sed $'s/TextImLookingFor/My\\\nReplacement\\\nText/' file
This is a file
My
Replacement
Text
look at all this text

这也适用于较新的gnu-sed。然而,新的gnu-sed可能只需要:

sed 's/TextImLookingFor/My\nReplacement\nText/' file

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed '/TextImLookingFor/c\My\nReplacement\nText' file

答案 2 :(得分:0)

此命令的问题

sed 's/TextImLookingFor/My\'$'\nReplacement\'$'\nText/g' /path/to/File.txt

是它没有解析你期望的方式。

无法转义单引号字符串中的单引号。您可以转义$'...'引用字符串中的单引号但是(我不确定原因)。

所以上面的命令没有以这种方式解析(如你所料):

[sed] [s/TextImLookingFor/My\'$[\nReplacement\'$]\nText/g] [/path/to/File.txt]

而是以这种方式解析:

[sed] [s/TextImLookingFor/My\]$[\nReplacement\'$]\nText/g' [/path/to/File.txt]

末尾有一个不匹配的单引号和一个不带引号的\nText/g位。

这是导致问题的原因。

如果您不能在替换中使用\n(您的sed版本不支持此版本)并且您需要使用$'\n'那么您需要使用某些内容像

sed 's/TextImLookingFor/My\'$'\nReplacement\\'$'\nText/g' /path/to/File.txt