次の入力ファイルがあります。
...
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'
g
1行に複数の一致が必要ないため、末尾も削除します。
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