簡體   English   中英

在兩個方向都刪除n行,並在sed中匹配?

[英]Deleting n lines in both directions and the match in sed?

刪除匹配項和兩行之前,請先進行以下操作:

sed -i.bak -e '/match/,-2d' someCommonName.txt

在工作之后刪除匹配和兩行:

sed -i.bak -e '/match/,+2d' someCommonName.txt

但是刪除匹配項,然后刪除兩行,然后刪除兩行不起作用?

sed -i.bak -e '/match/-2,+2d' someCommonName.txt
sed: -e expression #1 unknown command: `-'

這是為什么?

我沒有一個完整的解決方案,但有一個概述: sed是一個非常簡單的工具,它不能一次完成兩件事。 我的方法是在刪除模式后的兩行后保留模式本身,然后運行sed 然后可以將結果通過管道重新發送到sed ,以刪除模式和之前的兩行。

sed在一系列地址上運行。 這意味着一個或兩個表達式,而不是三個。

/match/是與正則表達式匹配的地址。

-2是在前面指定兩行的地址

+2是指定后兩行的地址

因此:

/match/,-2是指定的線匹配的范圍內match之前兩行。

另一方面, /match/-2,+2d包含三個地址,因此沒有任何意義。

要刪除模式前后的兩行,我建議使用類似的方法( 根據此答案進行修改 ):

sed -n "1N;2N;/\npattern$/{N;N;d};P;N;D"

這將在緩沖區中保留3行並讀取文件。 在最后一行中找到該模式時,它將讀取另外兩行並刪除所有5。請注意,如果該模式位於文件的前兩行中,則此操作將無效,但這只是一個開始。

sed -i .bak '/match/,-2 {/match/!d;};/match/,+2d' YourFile

試試這個(不能在這里測試, -2在我的sed版本中不可用)

FWIW這就是我真正要做的工作(只需更改ba值,以在找到match之前/之后刪除不同數量的行):

$ cat file
1
2
3
4
5 match
6
7
8
9

$ awk -v b=2 -v a=2 'NR==FNR{if (/match/) for (i=(NR-b);i<=(NR+a);i++) skip[i]; next } !(FNR in skip)' file file
1
2
8
9

$ awk -v b=3 -v a=1 'NR==FNR{if (/match/) for (i=(NR-b);i<=(NR+a);i++) skip[i]; next } !(FNR in skip)' file file
1
7
8
9

請注意,以上假設假定當刪除窗口中出現2個“匹配項”時,您要基於原始匹配項進行刪除,而不是在找到第一個匹配項后刪除第二個匹配項會發生什么:

$ cat file2
1
2
3
4 match
5
6 match
7
8
9

$ awk -v b=2 -v a=2 'NR==FNR{if (/match/) for (i=(NR-b);i<=(NR+a);i++) skip[i]; next } !(FNR in skip)' file2 file2
1
9

與輸出相反:

1
7
8
9

因為在第一個match之后刪除2行將刪除第2個match ,所以THAT之后的2行不會被刪除,因為它們不再在match之后的2行之內。

還有其他需要考慮的事項:

$ diff --changed-group-format='%<' --unchanged-group-format='' file <(grep -A2 -B2 match file)
1
2
8
9

$ diff --changed-group-format='%<' --unchanged-group-format='' file2 <(grep -A2 -B2 match file2)
1
9

它使用bash和GNU diff 3.2,idk if /其他外殼程序/ diff將支持那些構造/選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM