使用shell脚本在指定的模式后将多行插入到文件中

use*_*r27 64 linux bash shell awk sed

我想使用shell脚本将多行插入到文件中.让我们考虑一下我的输入文件内容是: input.txt:

abcd
accd
cdef
line
web
Run Code Online (Sandbox Code Playgroud)

现在我必须在input.txt文件中的'cdef'行后插入四行.插入我的文件后应该改变如下:

abcd
accd
cdef
line1
line2
line3
line4
line
web
Run Code Online (Sandbox Code Playgroud)

我应该使用shell脚本进行上面的插入.谁能帮我?

sat*_*sat 87

另一个sed,

sed '/cdef/r add.txt' input.txt
Run Code Online (Sandbox Code Playgroud)

input.txt中:

abcd
accd
cdef
line
web
Run Code Online (Sandbox Code Playgroud)

add.txt:

line1
line2
line3
line4
Run Code Online (Sandbox Code Playgroud)

测试:

sat:~# sed '/cdef/r add.txt' input.txt
abcd
accd
cdef
line1
line2
line3
line4
line
web
Run Code Online (Sandbox Code Playgroud)

如果要在input.txt文件中应用更改.然后,使用-ised.

sed -i '/cdef/r add.txt' input.txt
Run Code Online (Sandbox Code Playgroud)

如果要将正则表达式用作表达式,则必须使用-E标记sed.

sed -E '/RegexPattern/r add.txt' input.txt
Run Code Online (Sandbox Code Playgroud)

  • 一种允许匿名文件的变体是将 here 文档通过管道传输到 sed 调用中,并使用 `r` 命令从 `/dev/stdin` 中读取。 (2认同)

dev*_*ull 30

使用GNU sed:

sed "/cdef/aline1\nline2\nline3\nline4" input.txt
Run Code Online (Sandbox Code Playgroud)

如果你开始:

abcd
accd
cdef
line
web
Run Code Online (Sandbox Code Playgroud)

这会产生:

abcd
accd
cdef
line1
line2
line3
line4
line
web
Run Code Online (Sandbox Code Playgroud)

如果要将更改保存到文件中,请说:

sed -i "/cdef/aline1\nline2\nline3\nline4" input.txt
Run Code Online (Sandbox Code Playgroud)

  • 我是'sed`的新手,但是我爱上了它的力量!如果你想附加一个空的换行符*first*你必须在append命令之后转义反斜杠字符,如下所示:`sed"/ cdef/a \\\nline1 \nline2 \nline3 \nline4"input.txt`.我不知道为什么它会像那样工作,如果有人可以解释这将是很好的! (4认同)
  • 当前命令在每次提到 `cdef` 时都会插入 line*,有没有办法让它只在第一次遇到 `cdef` 时插入,不再插入? (2认同)
  • MacOS `sed` 没有实现与 GNU `sed` 完全相同的 `a` 命令,因此上述内容在没有 mods 的 MacOS 中不起作用 - 至少从 macOS 10.13 开始(请参阅 https://unix.stackexchange。 com/a/131940/230763) (2认同)

Jan*_*eal 21

sed '/^cdef$/r'<(
    echo "line1"
    echo "line2"
    echo "line3"
    echo "line4"
) -i -- input.txt
Run Code Online (Sandbox Code Playgroud)

  • 请注意,当您从主机发出命令时,这在容器中不起作用,因为来自“&lt;(...)”的文件描述符将在主机而不是来宾上创建。使用 `/someline/a&lt;add\ncontent&gt;` 方法效果更好,特别是如果您执行类似 `sed "/someline/a$(echo 'here you can have newlines' | tr \\n @ | sed '\ ''s/@/\\n/g'\')" -i -- input.txt`(不是完整的示例,也没有经过适当的测试,我现在没有时间,但这应该包括建筑物块你需要的)。 (2认同)

jay*_*ngh 13

使用awk:

awk '/cdef/{print $0 RS "line1" RS "line2" RS "line3" RS "line4";next}1' input.txt 
Run Code Online (Sandbox Code Playgroud)

说明:

  • 您可以找到要使用的线条 /.../
  • 您使用打印当前行 print $0
  • RS是内置awk变量,默认情况下设置为new-line.
  • 您添加由此变量分隔的新行
  • 1最后导致所有其他线的打印.next之前使用它允许我们阻止当前行,因为您已经使用它来打印它print $0.

$ awk '/cdef/{print $0 RS "line1" RS "line2" RS "line3" RS "line4";next}1' input.txt
abcd
accd
cdef
line1
line2
line3
line4
line
web
Run Code Online (Sandbox Code Playgroud)

要对文件进行更改,您可以执行以下操作:

awk '...' input.txt > tmp && mv tmp input.txt
Run Code Online (Sandbox Code Playgroud)


man*_*ana 5

这是一个基于@rindeal解决方案的更通用的解决方案 ,它不适用于 MacOS/BSD(/r需要一个文件):

cat << DOC > input.txt
abc
cdef
line
DOC
Run Code Online (Sandbox Code Playgroud)
$ cat << EOF | sed '/^cdef$/ r /dev/stdin' input.txt
line 1
line 2
EOF

# outputs:
abc
cdef
line 1
line 2
line
Run Code Online (Sandbox Code Playgroud)

这可用于将任何内容通过管道传输到给定位置的文件中:

$ cat << EOF | sed '/^cdef$/ r /dev/stdin' input.txt
line 1
line 2
EOF

# outputs:
abc
cdef
line 1
line 2
line
Run Code Online (Sandbox Code Playgroud)

此外,您可以添加多个允许删除标记线的命令cdef

$ date | sed '/^cdef$/ r /dev/stdin' input.txt

# outputs
abc
cdef
Tue Mar 17 10:50:15 CET 2020
line
Run Code Online (Sandbox Code Playgroud)