尝试在 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'
它会删除换行符,但不会重新添加换行符或制表符。
这是愚蠢的错误吗?没有逃避我应该逃避的事情?
两件事:
- 您必须防止 shell 扩展
$VAR
,否则换行符将在您有机会处理它们之前丢失
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
将丢失所有格式(如果段落中有 $
等特殊字符,可能会做一些愚蠢的事情)。
我有一段文本正试图在脚本中像这样编辑:
首先,我尝试了
VAR2=`echo $VAR | sed 's/\n/\n\t/g'
它会删除换行符,但不会重新添加换行符或制表符。
这是愚蠢的错误吗?没有逃避我应该逃避的事情?
两件事:
- 您必须防止 shell 扩展
$VAR
,否则换行符将在您有机会处理它们之前丢失 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
将丢失所有格式(如果段落中有 $
等特殊字符,可能会做一些愚蠢的事情)。