2015-03-19 114 views
0

我有一個文件,它有很多的PIN。這種情況如下如何用新的段落替換段落

PIN ABC 
DIRECTION INPUT 
USE SIGNAL 

如圖所示我想

PIN ABC 
DIRECTION INPUT 
USE POWER 

替換此使得信號改變爲通電只有當PIN ABC是出現在文件中。是否可以用grep或awk來完成。

+1

如果你的問題涉及PIN_的__,你的示例數據應該至少包含其中的兩個。源代碼中是否有一些_paragraph_分隔符? – 2015-03-19 12:13:30

回答

1

使用awk,用線後重寫開始USEPIN ABC。最後的1打印(可能修改)的行。

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

請包括您的代碼的作用和解釋它回答了這個問題。如果你得到一個代碼片段作爲答案,你可能不知道如何處理它。回答應該給OP和未來訪問者指導如何調試和解決他們的問題。指出你的代碼背後的想法,對於理解這個問題以及應用或修改你的解決方案有很大的幫助。 [僅限代碼解答](http://meta.stackexchange.com/q/148272/238706) – Palec 2015-03-20 10:21:11

+0

@Palec雖然我贊同大/複雜的解決方案,但我不同意這種理念,用於簡單的代碼片段。目前和未來的讀者不知道這個解決方案會做什麼,將會比閱讀awk語法的第一章更多地閱讀awk文檔的第一章,而不是解釋awk語法的基礎知識,如果在閱讀完文檔後仍然無法確定他們總是可以問一個問題。 – 2015-03-20 15:53:43

+0

即使是微不足道的代碼片段也可以提供有用的描述。在開始學習新工具時閱讀文檔並不總是最好的選擇。評論片段可以作爲迷你教程,並且可以更有效。例如。在這種情況下,我會引入以下代碼片段:*使用'awk',在'PIN ABC'行後重寫以'USE'開頭的行。最後的'1'打印(可能是修改過的)行。* – Palec 2015-03-20 16:08:53

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 
+0

第二個命令重寫所有塊中的'USE'行。我猜想有更多的塊以'PIN '開始,以'USE POWER'或'USE SIGNAL'結尾。 – Palec 2015-03-20 16:12:54

+0

@Palec試試'awk'/^PIN ABC/{f = 1} f &&/^使用信號/ {$ 2 =「POWER」; f = 0} 1'文件' – Jotne 2015-03-20 16:29:24

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///命令允許.匹配換行符
0
sed -n '1h;1!H;${x;/PIN ABC/ s/USE SIGNAL/USE POWER/g;p;}' YourFile 
  • 不打印線,除非請求
  • 加載文件後打印在緩衝區(第一行覆寫,其他附加)
  • 最後
    • 如果PIN ABC發現,改變用途SIGNAL
    • 打印結果

現在,你肯定意味着很多不同的PIN ABC的(幾個相同的ABC或幾個PIN不同的ABC之間不明確),在這種情況下,這個腳本,像這樣不適合,因爲它在第一次發生時會改變每個使用信號。