Sed

此 sed 語法不會刪除空行

  • February 12, 2022

我有這個輸入文件:

...
https://long-url/something?value1=999&something=xyz?value2=555
https://long-url/something?value1=534&something=xyz?value2=2312


https://long-url/something?value1=534&something=xyz?value2=233
https://long-url/something?value1=534
...

我想擷取 value1 和 value2 並將它們輸出為 csv,並刪除任何不匹配的行:

...
999,555
534,2312
534,233
...

我在擷取值方面沒有問題,但我在刪除任何不需要的行時遇到了問題:

sed 's/.*categoryid=\([0-9]*\).*courseid=\([0-9]*\).*/\1,\2/g;/^[^0-9]\+/d' input-file

基本上,/^[^0-9]\+/d它沒有按預期工作。我在想它會刪除任何不以任何數字開頭的行,但相反,它給了我:

999,555
534,2312


534,233

我的 sed 版本:sed (GNU sed) 4.7

您正在使用替代品,然後是刪除

sed -e 's/.../.../g' -e '/.../d'

這有點不穩定,因為您/.../d可能會不小心匹配文件內容中的其他內容。

相反,我只會列印受替代品影響的行。這可以通過-n(預設情況下避免列印)來完成,然後添加p到行尾以列印匹配的行。這避免了第二個sed聲明的需要。

sed -ne 's/.../.../gp'

我還將刪除尾隨g,因為每行不需要超過一個匹配項:

sed -ne 's/.../.../p'

結果是:

sed -ne 's/.*categoryid=\([0-9]*\).*courseid=\([0-9]*\).*/\1,\2/p' input-file

在行動:

$ sed -ne 's/.*value1=\([0-9]*\).*value2=\([0-9]*\).*/\1,\2/p' << EOF
https://long-url/something?value1=999&something=xyz?value2=555
https://long-url/something?value1=534&something=xyz?value2=2312


https://long-url/something?value1=534&something=xyz?value2=233
https://long-url/something?value1=534
EOF

輸出

999,555
534,2312
534,233

引用自:https://unix.stackexchange.com/questions/690352