我正在使用 sed 在文件中的模式上方插入一些行。文件示例
Stuff
Pattern
Stuff
这是我用来分割文件以在之前插入文本的代码Pattern
patternline=$(grep -n "Pattern" "/my/file" | cut -f1 -d:)
firstcut=$(($patternline -1))
firstpart=$(sed -n 1,"$firstcut"p "/my/file")
secondpart=$(sed -n ''"$abspathcomment"',$p' "/my/file")
# Indentation intentional as snippet is nested within an IF statement
text=$(cat <<EOF
Text I want to insert with one leading and two trailing new lines
EOF
)
echo "$firstpart$text$secondpart" > "/my/file"
我使用 sed 分割文件并在中间插入我想要的文本,最后使用 cat 将内容输出到同一个文件。
我期望获得(类似于)文件的以下输出
Stuff
Text I want to insert with one leading and two trailing new lines
Pattern
Stuff
但相反我得到
Stuff
Text I want to insert with one leading and two trailing new linesPattern
Stuff
我不确定 sed 或 bash 是否正在删除换行符。在 bash 中将结果回显到文件时如何保留它们?
答案1
命令替换会消耗掉尾随的换行符:
a=$( printf 'hello\nworld\n\n\n\n\n\n' )
printf 'a is "%s"\n' "$a"
输出:
a is "hello
world"
使用sed
来解决原来的问题:
sed '/Pattern/i\
Text I want to insert with one leading and two trailing new lines\
\
' file
或者,使用 GNU sed
:
sed '/Pattern/i Text I want to insert with one leading and two trailing new lines\n\n' file
在这里,我们使用i
(“insert”) 命令sed
在任何匹配的行之前插入一组特定的行Pattern
。通过转义两个换行符(在第一个sed
变体中),我们可以将它们插入到文本中。结果中的前导换行符Pattern
与开头处的换行符相同。
对于示例数据,这会生成
Stuff
Text I want to insert with one leading and two trailing new lines
Pattern
Stuff
这样做的好处是现有的空白不会被修改。