如何用新段落替换段落

时间:2015-03-19 11:07:41

标签: perl unix awk sed

我有一个有很多PIN的文件。情况如下所示

PIN ABC
DIRECTION INPUT
USE SIGNAL

我想用

替换它
PIN ABC
DIRECTION INPUT
USE POWER

只有在文件中出现PIN ABC时才会将信号更改为电源。是否可以使用grep或awk来实现。

4 个答案:

答案 0 :(得分:2)

您可以使用此awk

awk '/^PIN ABC/ {a=NR} a+2==NR {$2="POWER"} 1' file
PIN ABC
DIRECTION INPUT
USE POWER

如果PINUSE之间的行数未修复:

awk '/^PIN/ {f=1} f && /^USE/ {$2="POWER";f=0} 1' file
PIN ABC
DIRECTION INPUT
USE POWER

答案 1 :(得分:2)

假设您的“段落”用空行分隔:

perl -00 -pe 's/^(PIN ABC.*USE) \w+/$1 POWER/s' <<END
some stuff

PIN ABC
DIRECTION INPUT
USE SIGNAL

PIN DEF
USE SIGNAL

more stuff
END
some stuff

PIN ABC
DIRECTION INPUT
USE POWER

PIN DEF
USE SIGNAL

more stuff

这使用

  • 选项-00来阅读段落,而不是行
  • -p循环记录并在修改后隐式打印
  • s修饰符s///修饰符,以允许.匹配换行符

答案 2 :(得分:1)

使用awk,在USE行之后重写以PIN ABC开头的行。最后的1打印(可能已修改)行。

$ awk '/^PIN/{pin=$2} /^USE/&&(pin=="ABC"){$2="POWER"} 1' file
PIN ABC
DIRECTION INPUT
USE POWER

答案 3 :(得分:0)

sed -n '1h;1!H;${x;/PIN ABC/ s/USE SIGNAL/USE POWER/g;p;}' YourFile
  • 除非提出要求否则不打印
  • 将文件加载到缓冲区(第1行覆盖,其他追加)
  • 最后
    • 如果找到PIN ABC,请更改USE SIGNAL
    • 打印结果

现在,你肯定意味着很多不同的PIN ABC(在几个相同的ABC或几个不同ABC的PIN之间不清楚),在这种情况下,这个脚本不适合,因为它在第一次出现时改变了每个使用信号