[英]pattern match and add line at the end or start of a line in a text file using 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.