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

2024-10-31 08:38:00
admin
原创
150
摘要:问题描述:我想使用 shell 脚本将多行插入到文件中。假设我的输入文件内容为: input.txt:abcd accd cdef line web 现在我必须在input.txt文件中的“cdef”行后插入四行。插入后我的文件应该会像这样改变:abcd accd cdef line1 line2 line3...

问题描述:

我想使用 shell 脚本将多行插入到文件中。假设我的输入文件内容为:
input.txt:

abcd
accd
cdef
line
web

现在我必须在input.txt文件中的“cdef”行后插入四行。插入后我的文件应该会像这样改变:

abcd
accd
cdef
line1
line2
line3
line4
line
web

我应该使用 shell 脚本进行上述插入。有人能帮助我吗?


解决方案 1:

其他sed

sed '/cdef/r add.txt' input.txt

输入.txt:

abcd
accd
cdef
line
web

添加.txt:

line1
line2
line3
line4

测试:

sat:~# sed '/cdef/r add.txt' input.txt
abcd
accd
cdef
line1
line2
line3
line4
line
web

如果您想应用文件中的更改input.txt。那么,使用-iwith sed

sed -i '/cdef/r add.txt' input.txt

如果您想使用正则表达式作为表达式,则必须使用-E带有 的标签sed

sed -E '/RegexPattern/r add.txt' input.txt

解决方案 2:

使用 GNU sed

sed "/cdef/aline1
line2
line3
line4" input.txt

如果你从以下开始:

abcd
accd
cdef
line
web

这将产生:

abcd
accd
cdef
line1
line2
line3
line4
line
web

如果你想将更改保存到文件原位,请说:

sed -i "/cdef/aline1
line2
line3
line4" input.txt

解决方案 3:

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

解决方案 4:

使用awk

awk '/cdef/{print $0 RS "line1" RS "line2" RS "line3" RS "line4";next}1' input.txt 

解释:

  • 你可以使用以下方法找到要插入的行/.../

  • 您可以使用以下方式打印当前行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

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

awk '...' input.txt > tmp && mv tmp input.txt

解决方案 5:

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

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

# outputs:
abc
cdef
line 1
line 2
line

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

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

# outputs
abc
cdef
Tue Mar 17 10:50:15 CET 2020
line

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

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

# outputs
abc
Tue Mar 17 10:53:53 CET 2020
line

解决方案 6:

基于@rindeal解决方案,但输入的可读性更好

sed '/^cdef$/r'<(cat <<EOF
line1
line2
line3
line4
EOF
) -i -- input.txt

解决方案 7:

您可以使用awk在 中间插入一些命令的输出input.txt

要插入的行可以是 的输出cat otherfilels -l或 4 行加上 生成的数字printf

awk 'NR==FNR {a[NR]=$0;next}
    {print}
    /cdef/ {for (i=1; i <= length(a); i++) { print a[i] }}'
    <(printf "%s
" line{1..4}) input.txt

解决方案 8:

这个答案很容易理解

  • 图案前复制

  • 添加线条

  • 按照图案复制

  • 替换原文件

FILENAME ='app/Providers/AuthServiceProvider.php'

步骤 1 复制,直到图案

sed '/THEPATTERNYOUARELOOKINGFOR/Q' $FILENAME >>${FILENAME}_temp

步骤 2 添加线条

cat << 'EOL' >> ${FILENAME}_temp

HERE YOU COPY AND
PASTE MULTIPLE
LINES, ALSO YOU CAN
//WRITE COMMENTS

AND NEW LINES
AND SPECIAL CHARS LIKE $THISONE

EOL

步骤 3 添加文件的其余部分

grep -A 9999 'THEPATTERNYOUARELOOKINGFOR' $FILENAME >>${FILENAME}_temp

替换原始文件

mv ${FILENAME}_temp $FILENAME

如果你需要变量,请在步骤 2 中将“EOL”替换为 EOL

cat << EOL >> ${FILENAME}_temp

this variable will expand: $variable1

EOL

解决方案 9:

假设您有一个名为“insert.txt”的文件,其中包含您要添加的行:

line1
line2
line3
line4

如果模式“cdef”在您的 input.txt 文件中重复多次,并且您想要在模式“cdef”的所有出现之后添加“insert.txt”中的行,那么一个简单的解决方案是:

sed -i -e '/cdef/r insert.txt' input.txt

但是,如果模式“cdef”在您的 input.txt 文件中重复多次,并且您只想在模式第一次出现之后添加“insert.txt”中的行,那么一个漂亮的解决方案是:

`printf "%s
" "/cdef/r insert.txt" w | ed -s input.txt`

如果该模式在您的 input.txt 文件中只出现一次,这两种解决方案都可以正常工作。

解决方案 10:

将内容放在第四行(如您所愿)

sed -i "4i line1
line2
line3
line4" input.txt

如果您不想保存对文件的更改,请删除“-i”:

sed "4i line1
line2
line3
line4" input.txt

使用 GNU* 的 sed

如果你使用以下命令启动 input.txt:

abcd
accd
cdef
line
web

这将产生:

abcd
accd
cdef
line1
line2
line3
line4
line
web

解决方案 11:

我需要使用最少的工具来模板化一些文件,而对于我来说,上述问题sed -e '/../r file.txt是它只在打印出比赛的其余部分后附加文件,而不是替换它。

这不起作用(所有匹配项都被替换,并且模式匹配从同一点继续)

#!/bin/bash

TEMPDIR=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")
# remove on exit
trap "rm -rf $TEMPDIR" EXIT

DCTEMPLATE=$TEMPDIR/dctemplate.txt
DCTEMPFILE=$TEMPDIR/dctempfile.txt

# template that will replace
printf "0replacement
1${SHELL} data
2anotherlinenoEOL" > $DCTEMPLATE

# test data
echo -e "xxy 
987 
xx xx
 yz yxxyy" > $DCTEMPFILE

# print original for debug
echo "---8<--- $DCTEMPFILE"
cat $DCTEMPFILE
echo "---8<--- $DCTEMPLATE"
cat $DCTEMPLATE
echo "---8<---"

# replace 'xx' -> contents of $DCTEMPFILE
perl -e "our $fname = '${DCTEMPLATE}';" -pe 's/xx/`cat $fname`/eg' ${DCTEMPFILE}

解决方案 12:

如果你想用 bash 脚本来做到这一点,那很有用。

echo $password | echo 'net.ipv4.ping_group_range=0 2147483647' |  sudo -S tee -a /etc/sysctl.conf
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1120  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   75  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   66  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   76  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   70  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用