使用bash脚本在文件中添加多行

3
使用bash脚本,我正在尝试在文件中插入一行文本(最终将有4行额外的文本,依次排列)。
我正在尝试实现iiSeymour在该主题中的答案: 从特定行开始在文件中插入行 我认为这与dgibbs在他自己的主题中所做的评论相同: Bash:在特定位置向文件中插入一行 我想要插入新文本的那一行非常长,因此我首先将其保存在变量中。
field1=$(head -2 file847script0.xml | tail -1)

我想要插入的文本是:

insert='newtext123'

在运行时:
sed -i".bak" "s/$field1/$field1\n$insert/" file847script0.xml 

我得到了这个错误:
sed: 1: "s/<ImageAnnotation xmln ...": bad flag in substitute command: 'c'

我也尝试着跟随这个线程:

sed throws 'bad flag in substitute command'

但是命令:
sed -i".bak" "s/\/$field1/$field1\n$insert/" file847script0.xml

仍然给我相同的错误:

sed: 1: "s/\/<ImageAnnotation xm ...": bad flag in substitute command: 'c'

我正在使用 Mac OS X 10.5。

你有什么想法,我做错了什么吗?谢谢!


我怀疑插入的字段文本正在破坏sed模式匹配语法,如果其中有“/”(如果是HTML,则可能会有),那么它将会中断。您可以尝试另一个模式匹配字符,例如:sed "s|$field...|..." ... - nic ferrier
命令 sed -i".bak" "s|$field1|$field1\n$insert|" file847script0.xml 插入了一行,但无法将 \n 识别为新行。我该如何解决?谢谢! - user3570398
2个回答

2

好吧,只需使用awk。不用担心替换文本中的特殊字符或随机单字符命令和标点。

在这种情况下,似乎只需要在第二行后打印一些新文本,那就是:

$ cat file
a
b
c

$ insert='absolutely any text you want, including newlines
slashes (/), backslashes (\\), whatever...'

$ awk -v insert="$insert" '{print} NR==2{print insert}' file
a
b
absolutely any text you want, including newlines
slashes (/), backslashes (\), whatever...
c

0

按行号做不是更容易吗?如果你知道它是第二行或第n行(如果你使用grep进行模式匹配,grep会告诉你行号),那么你可以简单地使用sed找到正确的行,然后添加一行新行(或4行新行)。

cat <<EOF > testfile
one two three
four five six
seven eight nine
EOF

sed -re '2a\hello there' testfile

将输出

one two three
four five six
hello there
seven eight nine

我实际上成功在特定行插入了一个新行,但它不会“推”整个文本向下。我会得到新文本和旧文本在同一行。 - user3570398
好的,我成功了。我猜你在sed中使用了“i”命令而不是“a”命令?OSX上的sed与通常安装在Linux机器上的GNU sed不完全相同。也许有所不同。我手头没有OSX来测试。 - nic ferrier
我之前使用的是sed -i".bak" '3a\ new line' file.xml。我尝试了你的答案,但-re选项是“非法”的。我明白了,是的,我正在学习,这不一样。谢谢! - user3570398
也许这是与OSX的sed不同之处...你可以尝试:sed '3a\ new line' file.xml ```` --在`3a\`后面加上回车 - nic ferrier
是的,这就是我尝试并成功的方法;也就是说:我插入了文本,但在先前有文本的行中,插入的文本在旧文本之前... 再次感谢! - user3570398

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接