在文件中从特定行开始插入行

问题描述 投票:0回答:4

我想从特定行开始将行插入到 bash 中的文件中。

每一行都是一个字符串,它是数组的一个元素

line[0]="foo"
line[1]="bar"
...

具体行是“fields”

file="$(cat $myfile)"
for p in $file; do
    if [ "$p" = 'fields' ]
        then insertlines()     #<- here
    fi
done
bash sed
4个回答
110
投票

这可以使用 sed 完成:

sed 's/fields/fields\nNew Inserted Line/'

$ cat file.txt 
line 1
line 2 
fields
line 3
another line 
fields
dkhs

$ sed 's/fields/fields\nNew Inserted Line/' file.txt 
line 1
line 2 
fields
New Inserted Line
line 3
another line 
fields
New Inserted Line
dkhs

使用

-i
就地保存,而不是打印到
stdout

sed -i 's/fields/fields\nNew Inserted Line/'

作为 bash 脚本:

#!/bin/bash

match='fields'
insert='New Inserted Line'
file='file.txt'

sed -i "s/$match/$match\n$insert/" $file

注意: 选项

-i
并非在所有版本的 sed 上都受支持(例如 不在 Solaris 上)。您可以使用 GNU sed,它确实支持它。


20
投票

或者另一个例子

sed
:

准备

test.txt
文件:

echo -e "line 1\nline 2\nline 3\nline 4" > /tmp/test.txt

cat /tmp/test.txt
line 1
line 2
line 3
line 4

test.txt
文件中添加新行:

sed -i '2 a line 2.5' /tmp/test.txt
# sed for in-place editing (-i) of the file: 'LINE_NUMBER a-ppend TEXT_TO_ADD'

cat /tmp/test.txt
line 1
line 2
line 2.5
line 3
line 4

7
投票

这绝对是您想要使用类似

sed
(或
awk
perl
)之类的情况,而不是在 shell 循环中一次读取一行。 这不是 shell 能做得很好或效率很高的事情。

您可能会发现编写可重用函数很方便。 这是一个简单的方法,但它不适用于完全任意的文本(斜杠或正则表达式元字符会使事情变得混乱):

function insertAfter # file line newText
{
   local file="$1" line="$2" newText="$3"
   sed -i -e "/^$line$/a"$'\\\n'"$newText"$'\n' "$file"
}

示例:

$ cat foo.txt
Now is the time for all good men to come to the aid of their party.
The quick brown fox jumps over a lazy dog.
$ insertAfter foo.txt \
   "Now is the time for all good men to come to the aid of their party." \
   "The previous line is missing 'bjkquvxz.'"
$ cat foo.txt
Now is the time for all good men to come to the aid of their party.
The previous line is missing 'bjkquvxz.'
The quick brown fox jumps over a lazy dog.
$ 

-1
投票

sed 是你的朋友:

:~$ cat text.txt 
foo
bar
baz
~$ 

~$ sed '/^bar/\na this is the new line/' text.txt > new_text.txt
~$ cat new_text.txt 
foo
bar
this is the new line
baz
~$ 
© www.soinside.com 2019 - 2024. All rights reserved.