この 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

ベストアンサー1

あなたは変える、次に削除:

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

/.../d誤ってファイルコンテンツ内の他の項目と一致する可能性があるため、これはやや不安定です。

代わりに、置換によって影響を受けた行のみを印刷します。これは、(デフォルトの印刷を避けるために)行の末尾に-n追加して、一致する行を印刷することによって行うことができます。pこれにより、2番目のステートメントは必要ありませんsed

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

g1行に複数の一致が必要ないため、末尾も削除します。

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

おすすめ記事