我正在尝试用多行替换文件中的一行。当我只有一个新行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
答案 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