我需要在文件中搜索模式(如X)後替換第4行(其中包含模式Y)。請注意圖案Y也用於別處。所以我不能直接替換它。另請注意,第4行只有一個字Y. 是否有任何可以輕鬆執行的腳本命令?可能是「awk」有用,但不確定如何正確使用它。替換文件中搜索模式下方的第n行
例如:在文件中搜索X的模式。 在文件中,我們必須說
X,
C,
D,
Y,
A,
現在我需要更換Y,它是4號線的說B,
。
我需要在文件中搜索模式(如X)後替換第4行(其中包含模式Y)。請注意圖案Y也用於別處。所以我不能直接替換它。另請注意,第4行只有一個字Y. 是否有任何可以輕鬆執行的腳本命令?可能是「awk」有用,但不確定如何正確使用它。替換文件中搜索模式下方的第n行
例如:在文件中搜索X的模式。 在文件中,我們必須說
X,
C,
D,
Y,
A,
現在我需要更換Y,它是4號線的說B,
。
對於線數量少:
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
你可以使用這樣的事情在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
後已被替換。無論X
和Y,
之間有多少行,或者在第一個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,
另一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'
我發現另一種方式在vim通過映射鍵使用
:map z n4j^cwY<esc>
說明:
n
是下一個4j
4行以下cw
是改變字Y
是圖案名稱
感謝湯姆。但是它只能取代一個地方。如果需要替換文件中的所有位置,該怎麼辦?我不太清楚「awk」。所以請原諒。 – amrendra47
我已經更新了我的答案,希望有所幫助。 –