Regex sed,如何将一行替换为两行?

Regex sed,如何将一行替换为两行?,regex,insert,replace,sed,debian,Regex,Insert,Replace,Sed,Debian,我试图在debian中使用sed将1行替换为2行,下面是我的想法: sed -i 's/You are good/You are good\n You are the best/g' /output.txt 然而,当我这么做的时候,塞德一直抱怨说“s”的选项未知 有人能帮忙吗 谢谢 如果您在bash中,请尝试以下操作: sed -i.bak $'s/You are good/You are good\\\nYou are the best/g' /output.txt 奇怪,嗯?但似乎有效

我试图在debian中使用sed将1行替换为2行,下面是我的想法:

 sed -i 's/You are good/You are good\n You are the best/g' /output.txt
然而,当我这么做的时候,塞德一直抱怨说“s”的选项未知

有人能帮忙吗


谢谢

如果您在bash中,请尝试以下操作:

sed -i.bak $'s/You are good/You are good\\\nYou are the best/g' /output.txt
奇怪,嗯?但似乎有效。可能sed无法正确处理换行符,因此需要使用另一个反斜杠对其进行转义,从而在转到sed之前将成为一个单独的
\

另外,请注意,您没有向
-i
传递扩展名


编辑 刚刚找到另一个解决办法。由于在传递给sed时需要转义换行符(否则它会认为它是命令终止符),因此实际上可以使用单引号和返回符,只需在输入换行符之前插入反斜杠即可

$ echo test | sed 's/test/line\
> line'
line
line

或者,代替搜索和替换(
s
命令),搜索和追加(
a
命令)

编辑:

可能我目前最喜欢的方法是使用特殊字符来代替'\n'。在传递字符串时,引用规则会让人头疼。但是如果你用
来代替
\n
来代替
来打包字符串,那么你就拥有了一个真正的可移植的表示形式,可以传递给函数等等

下面是一个例子:

whatAmI=$( printf "Wow oh wow\nYou are good\n"| \
             sed -e 's#\(You are \)\(good\)#\1\2|\1the best#g' | \
             tr '\n' '|' | tr ' ' '_' )
结果:

哇哦哇你真好你是最棒的|

要“解压”压扁的字符串,只需将其通过相同的
tr
,但顺序相反

i、 e

结果

哇哦哇
你很好
你是最棒的


除上述策略外(使用appen--
/a
并使用
\\\n
进行定界),您还可以执行以下操作:

sed -i 's/You are good/You are good'"\n"' You are the best/g' /output.txt
在某种程度上,我更喜欢格伦·杰克曼的解决方案,因为它更符合我的意图

但是我发现这个策略很有用,因为您也可以使用它在bash脚本中传递变量。如果您不打算多次使用一个变量,那么它比
-v
更简洁

whatYouAre="okay"
sed -i 's/You are good/You are good'"\n"' You are '"${whatYouAre}"'/g' /output.txt

(注意:单引号也适用于
\n
,但不适用于传递变量,因为它需要解释。)

忘了提到,这是用于shell脚本,环境是Debian 6只是一个一般性的注释,我建议在sed中使用
#
而不是
/
,作为一般规则。有时,在编辑包含
#
的文件或流时,您会希望使用
/
作为分隔符(例如,用于bashscript中的注释)。但更多情况下(至少以我的经验),您将不使用
#
s编辑文本,而是将
/
作为Linux目录的一部分进行编辑。表册如果你使用英镑符号,你就不必担心划界(尽管其他划界规则也适用)。这里有一个粗略的例子:
echo'/a/'\sed-e's#/a/\35;/#/g'
vs.
echo'/a/'\sed-e's/\/a\/\//\//\/g'
这是一个很好的分隔符——我多年来一直在推动这个分隔符——不幸的是,你所看到的每一个sed例子都使用/作为分隔符——这大概是最无用的字符。好的,考虑到你可以使用任何字符,“e”可能更糟糕-sed“sesom\estring带有一个\ee/\el\ephantsee”hmm,这很好,我不知道sed的功能。方便的如何以空格开始新行?假设我正在编辑一个YAML文件
sed -i 's/You are good/You are good'"\n"' You are the best/g' /output.txt
whatYouAre="okay"
sed -i 's/You are good/You are good'"\n"' You are '"${whatYouAre}"'/g' /output.txt