Sed
此 sed 語法不會刪除空行
我有這個輸入文件:
... 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