如何用新的段落替换段落
我有一个文件,它有很多的PIN。这种情况如下如何用新的段落替换段落
PIN ABC
DIRECTION INPUT
USE SIGNAL
如图所示我想
PIN ABC
DIRECTION INPUT
USE POWER
替换此使得信号改变为通电只有当PIN ABC是出现在文件中。是否可以用grep或awk来完成。
使用awk
,用线后重写开始USE
线PIN ABC
。最后的1
打印(可能修改)的行。
$ awk '/^PIN/{pin=$2} /^USE/&&(pin=="ABC"){$2="POWER"} 1' file
PIN ABC
DIRECTION INPUT
USE POWER
请包括您的代码的作用和解释它回答了这个问题。如果你得到一个代码片段作为答案,你可能不知道如何处理它。回答应该给OP和未来访问者指导如何调试和解决他们的问题。指出你的代码背后的想法,对于理解这个问题以及应用或修改你的解决方案有很大的帮助。 [仅限代码解答](http://meta.stackexchange.com/q/148272/238706) – Palec 2015-03-20 10:21:11
@Palec虽然我赞同大/复杂的解决方案,但我不同意这种理念,用于简单的代码片段。目前和未来的读者不知道这个解决方案会做什么,将会比阅读awk语法的第一章更多地阅读awk文档的第一章,而不是解释awk语法的基础知识,如果在阅读完文档后仍然无法确定他们总是可以问一个问题。 – 2015-03-20 15:53:43
即使是微不足道的代码片段也可以提供有用的描述。在开始学习新工具时阅读文档并不总是最好的选择。评论片段可以作为迷你教程,并且可以更有效。例如。在这种情况下,我会引入以下代码片段:*使用'awk',在'PIN ABC'行后重写以'USE'开头的行。最后的'1'打印(可能是修改过的)行。* – Palec 2015-03-20 16:08:53
您可以使用此awk
awk '/^PIN ABC/ {a=NR} a+2==NR {$2="POWER"} 1' file
PIN ABC
DIRECTION INPUT
USE POWER
如果PIN
和USE
之间的行数不固定:
awk '/^PIN/ {f=1} f && /^USE/ {$2="POWER";f=0} 1' file
PIN ABC
DIRECTION INPUT
USE POWER
假设你的 “段落” 是由空行分隔:
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///
命令允许.
匹配换行符
sed -n '1h;1!H;${x;/PIN ABC/ s/USE SIGNAL/USE POWER/g;p;}' YourFile
- 不打印线,除非请求
- 加载文件后打印在缓冲区(第一行覆写,其他附加)
- 最后
- 如果PIN ABC发现,改变用途SIGNAL
- 打印结果
现在,你肯定意味着很多不同的PIN ABC的(几个相同的ABC或几个PIN不同的ABC之间不明确),在这种情况下,这个脚本,像这样不适合,因为它在第一次发生时会改变每个使用信号。
如果你的问题涉及PIN_的__,你的示例数据应该至少包含其中的两个。源代码中是否有一些_paragraph_分隔符? – 2015-03-19 12:13:30