簡體   English   中英

使用sed匹配模式並從行中刪除到文件末尾

[英]Using sed to match a pattern and deleting from the line to the end of the file

我正在嘗試匹配來自管道輸入和/或文件的模式,然后從匹配的行中刪除到文件的末尾,包括。 我到處尋找,但似乎找不到符合我需要的表達方式。

以下表達式允許我刪除到流的開頭,包括匹配的模式:

sed -e '1,/Files:/d'

給出一些樣本數據:

Blah blah blah
Foobar foo foo
Files:
 somefiles.tar.gz 1 2 3
 somefiles.tar.gz 1 2 3

-----THIS STUFF IS USELESS-----
BLEH BLEH BLEH
BLEH BLEH BLEH

運行上面的表達式會產生:

Files:
 somefiles.tar.gz 1 2 3
 somefiles.tar.gz 1 2 3

-----THIS STUFF IS USELESS-----
BLEH BLEH BLEH
BLEH BLEH BLEH

我想達到類似的效果,但方向相反。 使用前一個表達式的輸出,我想從-----THIS STUFF IS USELESS-----刪除到文件的末尾,包括在內。 它應該產生(在經過第一個表達式之后):

Files:
 somefiles.tar.gz 1 2 3
 somefiles.tar.gz 1 2 3

我也願意使用任何其他工具,只要它可以在任何其他POSIX系統上使用,並且不使用特定於版本(例如GNU特定)的選項。

實際文本可以在這里找到: http-----THIS STUFF IS USELESS-----注意從-----THIS STUFF IS USELESS-----的改變-----THIS STUFF IS USELESS----------BEGIN PGP SIGNATURE-----

為什么不

 sed '/^-----THIS STUFF IS USELESS-----$/,$d' file

在您使用的范圍表達式中,',$'將指定“到文件的末尾”

1 is first line in file, 
$ is last line in file.

產量

Files:
 somefiles.tar.gz 1 2 3
 somefiles.tar.gz 1 2 3


使用GNU sed ,你可以做到

sed '/^-----THIS STUFF IS USELESS-----$/Q' file

其中Q類似於q quit命令,但不打印匹配行

而不是試圖弄清楚如何表達你不想要的東西,只需打印你想要的東西:

awk -v RS= '/Files:/' file

編輯:鑒於您修改輸入:

awk '/^Files:$/{f=1} f; /^$/{f=0}' file

要么:

awk '/^Files:$/{f=1} f; /^-----THIS STUFF IS USELESS-----$/{f=0}' file

如果你更喜歡。

您還可以使用以下任一方法:

awk '/^Files:$/,/^-----THIS STUFF IS USELESS-----$/' file
sed '/^Files:$/,/^-----THIS STUFF IS USELESS-----$/' file

但他們以后很難延長。

sed -e '/^-----THIS STUFF IS USELESS-----$/,$ d'

臟工具刀grep版本:

cat your_output.txt | grep -B 99999999 "THIS STUFF IS USELESS" | grep -v "THIS STUFF IS USELESS"

這是一個正則表達式,我認為它會做你想要的: ^(?:(?!Files:).)+|\\s*-----THIS STUFF IS USELESS-----.+確保設置dotall標志。

演示+解釋: http//regex101.com/r/xF2fN5

您只需要運行這個表達式。

暫無
暫無

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

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