我有一個文件,它有很多的PIN。這種情況如下如何用新的段落替換段落
PIN ABC
DIRECTION INPUT
USE SIGNAL
如圖所示我想
PIN ABC
DIRECTION INPUT
USE POWER
替換此使得信號改變爲通電只有當PIN ABC是出現在文件中。是否可以用grep或awk來完成。
我有一個文件,它有很多的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的(幾個相同的ABC或幾個PIN不同的ABC之間不明確),在這種情況下,這個腳本,像這樣不適合,因爲它在第一次發生時會改變每個使用信號。
如果你的問題涉及PIN_的__,你的示例數據應該至少包含其中的兩個。源代碼中是否有一些_paragraph_分隔符? – 2015-03-19 12:13:30