在文本文件节中添加 2 行

zta*_*013 2 bash sed awk shell-script

我有一个分节的文本文件。每节以 [keyword] 开头,以空行结尾。像这样的东西:

[keyword1]
param1 = value1
param2 = value2
param3 = value3

[keyword2]
param4 = value4
param5 = value5
...
Run Code Online (Sandbox Code Playgroud)

我需要一个脚本(可能单行命令可以工作)在给定的[keyword]. 要插入的行就像上面的几对:

param = value
Run Code Online (Sandbox Code Playgroud)

我正在考虑使用sed就地编辑加上备份副本文件以防万一。

man*_*ork 7

是的,sed听起来是正确的选择:

sed -i.bak '/^\[keyword1\]/aparam = value\nparam = other' your.file
Run Code Online (Sandbox Code Playgroud)

awk 可以做到,除了就地编辑部分:

awk '1;/^\[keyword1\]/{print"param = value";print"param = other"}' your.file > new.file
Run Code Online (Sandbox Code Playgroud)

如果你不在乎使用大枪perl来完成这么小的任务:

perl -i.bak -pe '$_.="param = value\nparam = other\n"if/^\[keyword1\]/' your.file
Run Code Online (Sandbox Code Playgroud)

后一个将ruby使用 1 个字符修改:

ruby -i.bak -pe '$_+="param = value\nparam = other\n"if/^\[keyword1\]/' your.file
Run Code Online (Sandbox Code Playgroud)

python 解决方案有点冗长(可能因我的知识弱点而恶化):

python -c 'import sys,fileinput;[sys.stdout.write(line+("param = value\nparam = other\n" if line=="[keyword1]\n" else "")) for line in fileinput.input(inplace=1,backup=".bak")]' your.file
Run Code Online (Sandbox Code Playgroud)

再次没有就地编辑,但bash也ksh可以做到:

while IFS='' read -r line; do
  echo "$line"
  [[ "$line" == '[keyword1]' ]] && {
    echo "param = value"
    echo "param = other"
  }
done < your.file > new.file
Run Code Online (Sandbox Code Playgroud)

与ed简单的就地编辑,但我知道没有办法创建备份:

ed -s your.file <<< $'/^\[keyword1\]/a\nparam = value\nparam = other\n.\nwq'
Run Code Online (Sandbox Code Playgroud)