sed 在匹配后添加行(开头没有空格)(使用变量的脚本)

sed 在匹配后添加行(开头没有空格)(使用变量的脚本)

当脚本在搜索模式后添加行时,请帮助解决空格问题

$ cat test.txt 
   test    server:1 

 prod  server 1

$ cat ./check.sh 
#!/bin/bash
#
search="   test    server:1"
add="                 test        server:1000"
echo "starting"
sed -e "/${search}/a${add}" ./test.txt

$ ./check.sh 
starting
   test    server:1 
test        server:1000

 prod  server 1

test server:1000 之前的空格丢失了。我该如何修复这个问题?

答案1

你所看到的是 GNU 扩展命令之间的细微差别

a text

在行后附加文本。这是标准 a 命令的 GNU 扩展 - 详情请参阅下文。

其中手册指出

a 命令后的前导空格将被忽略。

以及更便携的原始形式

a\
text

不会删除前导空格。有几种方法可以在“一行”代码中实现后者的行为,例如

$ sed "/${search}/a\\${add}" ./test.txt
   test    server:1 
                 test        server:1000

 prod  server 1

(注意\需要在双引号内进行转义)或

$ sed "/${search}/a"'\'"${add}" ./test.txt
   test    server:1 
                 test        server:1000

 prod  server 1

或者

$ sed -e "/${search}/a\\" -e "${add}" ./test.txt
   test    server:1 
                 test        server:1000

 prod  server 1

(但请注意,最后一个依赖于另一个 GNU 扩展-e)。

答案2

您需要转义空格,否则sed将会忽略它,因为/pattern/atext/pattern/a text和的/pattern/a text解释相同。

用这个:

sed -e "/${search}/a${add// /\\ }" ./test.txt

相关内容