sed 在第 N 次出现后追加文本

sed append text after N-th occurrence

我有以下脚本的模板,我需要为每个案例插入不同的 PARAM 值。

case  in
1)
    export PARAM=
    ;;
2)
    export PARAM=
    ;;
3)
    export PARAM=
    ;;
esac

我刚刚找到了一个如何为第一种情况插入值的示例 PARAM:

sed -i '/export PARAM=/{s//export PARAM=1212212121/;:a;n;ba}' file

但是对于案例 2 和案例 3 我该如何做呢?

使用awk:

awk -v v="1212212121" -v n=2 '/Param/{c++} c==n-1{$(NF)+=" "v}1' file
awk -v v="1212212333" -v n=3 '/Param/{c++} c==n-1{$(NF)+=" "v}1' file

等等...

解释:

  • /Param/{c++} 每次找到模式 /Param/ 时都会增加一个计数器 c
  • c==n-1 检查 c 是否具有所需的值并将该值添加到
  • 1 总是 trueawk 将打印所有行。
  • -v v="1212212121" -v n=2 将变量 vn 传递给脚本。

这可能对你有用 (GNU sed):

n=2 v=11212212121
sed -ri '/export PARAM=/{x;s/^/x/;/x{'$n'}/!{x;b};x;s/(export PARAM=).*/'$v'/;:a;n;ba}' file

保留一个计数器space,如果计数器符合您的预期,替换并打印出文件的其余部分。