sedを使用してさまざまな数字やその他の文字を一致させる

sedを使用してさまざまな数字やその他の文字を一致させる

sed私はPerlのような正規表現を書く傾向があります。

[\d-_]+

たとえば、数字、ダッシュ、アンダースコアを一致させます。それは魅力のように動作しますgrep

$もっとsed_example.txt
一部 2021-04-21_08-45_file
その他2021-04-21_08-15_test
など。
$ grep -P "[\d-_]+" sed_example.txt2021-04-21_08-45_文書
その他2021-04-21_08-15_テスト

私はsedで同じことをしたいのですが、拡張式(-r)としても使用できず、範囲(たとえばor)を他の文字と\d組み合わせることができないか、少なくとも方法を見つけることができませんでした。 1つの解決策はすべての数字を明示的にリストすることですが、あまりにも怠惰です。[0-9][[:digits:]]

どんな助けでも大変感謝します!

ベストアンサー1

範囲が適切ではありません(開始して実行する範囲が[\d-_]ありません)。そんな意味でしたか?\d_[\d_-]

POSIXに該当するのはまたは[\d_-]です。角かっこ式にリテラルダッシュを含めるには、最初または最後に表示する必要があります。[[:digit:]_-][0-9_-]

$ grep -o '[[:digit:]_-]\{1,\}' file
2021-04-21_08-45_
2021-04-21_08-15_
$ sed -n 's/.* \([[:digit:]_-]\{1,\}\).*/\1/p' file
2021-04-21_08-45_
2021-04-21_08-15_

ここでは、最初の数字の前のスペースを一致させる必要があります。それ以外の場合は、_最後の数字だけをキャプチャします。

数値、ダッシュ、またはアンダースコアの代わりに、探しているフォームのアイテムと実際に一致させるより具体的な正規表現を使用することもできます。

$ sed -n 's/.*\([0-9]\{4\}-[0-9][0-9]-[0-9][0-9]_[0-9][0-9]-[0-9][0-9]_\).*/\1/p' file
2021-04-21_08-45_
2021-04-21_08-15_

$ tr -d -c '\n[:digit:]_-' <file | tr -s '\n'
2021-04-21_08-45_
2021-04-21_08-15_

trここでは、数字以外の文字、改行以外の文字、アンダースコア以外の文字、ダッシュ以外の文字をすべて削除しました。その後、それを再利用して、複数の連続改行文字を単一の改行文字に圧縮しました。

おすすめ記事