sed 行内の特殊文字とスペースを削除します

sed 行内の特殊文字とスペースを削除します

入力

[*] 111, 22, 33, 44

出力

111,22,33,44

sedコマンドを使用すると、スペースがまだあることを示すsed 's/^\[\*\][[:space:]]*//' file出力を表示できました111, 22, 33, 44

では正しいsedコマンドは何でしょうか?

答え1

簡単に答えると、これはあなたが望むことを実現するはずです:

sed 's/[][*]\|[[:space:]]//g'

次のようにテストします:

echo '[*] 111, 22, 33, 44' | sed 's/[][*]\|[[:space:]]//g'

出力:

111,22,33,44

より詳しい説明は下記をご覧ください。


あなたの表現に欠けていた重要な要素は、コマンドgグローバル置換を実行します。このコマンドを使用しないと、各行の最初の一致のみが置換されます。

私の解決策の中で最も直感に反する部分は(私の意見では)角括弧を文字クラス内に含める方法です。そのためには、sed マニュアル:

‘]’
    ends the bracket expression if it’s not the first list item.
    So, if you want to make the ‘]’ character a list item, you must put it first.

このトピックに関する詳細な議論については、SeverFault の次の投稿を参照してください。

あるいは、式を取得して別のsedコマンドにパイプすることもできます。例:

echo '[*] 111, 22, 33, 44' \
| sed 's/^\[\*\]//' \
| sed 's/[[:space:]]//g'

関連情報