尝试在 sed 中搜索并用换行符和制表符 ("\n\t") 替换换行符 ("\n")

Trying to search and replace newline ("\n") with newline and tab ("\n\t") in sed

我有一段文本正试图在脚本中像这样编辑:

首先,我尝试了

VAR2=`echo $VAR | sed 's/\n/\n\t/g'

它会删除换行符,但不会重新添加换行符或制表符。

这是愚蠢的错误吗?没有逃避我应该逃避的事情?

两件事:

  1. 您必须防止 shell 扩展 $VAR,否则换行符将在您有机会处理它们之前丢失
  2. sed 以基于行的方式工作。它单独处理每一行,并且看不到它们之间的换行符(除非你做了特殊的事情)。

第一个问题可以通过引用 $VAR 来解决,第二个问题我可以通过将问题重新表述为 "insert a tab to the beginning of every line but the first." 来规避,这给我们留下了:

VAR2=$(echo "$VAR" | sed '1!s/^/\t/')

sed 代码的意思是:在条件 1! 下(当我们不处理第一行时就是这种情况),执行 s/^/\t/ —— 即替换空字符串带有制表符的行的开头。

请注意,要查看替换结果,您还必须将其引用,否则它将被 shell 扩展,并且插入的空格将丢失。也就是说,

echo "$VAR2"

会显示你想要的结果,而

echo $VAR2

将丢失所有格式(如果段落中有 $ 等特殊字符,可能会做一些愚蠢的事情)。