这里标记忽略尾随换行符

这里标记忽略尾随换行符

我正在使用 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

这样做的好处是现有的空白不会被修改。

相关内容