2015-09-03 95 views
2

我需要在文件中搜索模式(如X)後替換第4行(其中包含模式Y)。請注意圖案Y也用於別處。所以我不能直接替換它。另請注意,第4行只有一個字Y. 是否有任何可以輕鬆執行的腳本命令?可能是「awk」有用,但不確定如何正確使用它。替換文件中搜索模式下方的第n行

例如:在文件中搜索X的模式。 在文件中,我們必須說

X, 
C, 
D, 
Y, 
A, 

現在我需要更換Y,它是4號線的說B,

回答

2

對於線數量少:

sed '/X/ { n; n; n; s/Y/B/; }' filename 

這是相當簡單:

/X/ {  # If the current line matches /X/ 
    n  # fetch the next line (printing the current one unchanged) 
    n  # and the next line 
    n  # and the next line 
    s/Y/B/ # and in that line, replace Y with B. 
} 

由於這成爲大量有點笨拙,你可能要考慮使用AWK對於這樣的情況:

awk 'NR == marker { sub(/Y/, "B") } /X/ { marker = NR + 3 } 1' filename 

即:

NR == marker { sub(/Y/, "B") } # if the current line is marked, substitute 
/X/ { marker = NR + 3 }   # if the current line matches /X/, mark the one 
           # that comes three lines later for substitution 
1        # print 
3

你可以使用這樣的事情在AWK:

awk '/X/ || f == 1 && sub(/Y,/, "B,") { ++f } 1' file 

這臺標誌f爲1(或)當模式/X/匹配。當f爲真並且sub返回值(它在執行替換時它會執行此操作),則s設置爲true,並且f回到false。這意味着f只有一次,所以只有一次出現Y,將被替換。

測試它在一個稍微不同的例子,一個你在你的問題表明:

$ cat file 
Y, 
A, 
X, 
C, 
D, 
Y, 
A, 
X, 
Y, 
$ awk '/X/ && !s { f = 1 } f && sub(/Y,/, "B,") { s = 1; f = 0 } 1' file 
Y, 
A, 
X, 
C, 
D, 
B, 
A, 
X, 
Y, 

正如你所看到的,只有Y,第一X後已被替換。無論XY,之間有多少行,或者在第一個Y,之前是否有多於一個的X


如果你想X後替代的Y,所有出現出現,那麼你就可以簡化代碼:

awk '/X/ { f = 1 } f { sub(/Y,/, "B,") } 1' file 

和以前一樣,這臺標誌f/X/已經找到。然後每次從這個點開始找到Y,

測試它,使用輸入與上面相同:

$ awk '/X/ && !s { f = 1 } f { sub(/Y,/, "B,") } 1' file 
Y, 
A, 
X, 
C, 
D, 
B, 
A, 
X, 
B, 
+0

感謝湯姆。但是它只能取代一個地方。如果需要替換文件中的所有位置,該怎麼辦?我不太清楚「awk」。所以請原諒。 – amrendra47

+0

我已經更新了我的答案,希望有所幫助。 –

2

另一awk替代,類似於湯姆·費內奇的,但也許更容易,如果在X,而不是取代閱讀

​​

,替代;當匹配X時將上下文設置爲x;打印。以上將取代第一例。如果只想替換第n行,則可以執行以下變化。

awk 'x&&c++==2{sub(/Y/,"B")} /X/{x=1} 1' 

這將取代第一次X匹配後的第三行(計數器從零開始)。或者,如果你想看到 「3」 的劇本,

awk 'x&&++c==3{sub(/Y/,"B")} /X/{x=1} 1' 
0

我發現另一種方式在vim通過映射鍵使用

:map z n4j^cwY<esc> 

說明:

  • n是下一個
  • 4j 4行以下
  • cw是改變字
  • Y是圖案名稱
相關問題