sed
私はPerlのような正規表現を書く傾向があります。
[\d-_]+
たとえば、数字、ダッシュ、アンダースコアを一致させます。それは魅力のように動作しますgrep
。
$もっとsed_example.txt 一部 2021-04-21_08-45_file その他2021-04-21_08-15_test など。 $ grep -P "[\d-_]+" sed_example.txt 何2021-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
ここでは、数字以外の文字、改行以外の文字、アンダースコア以外の文字、ダッシュ以外の文字をすべて削除しました。その後、それを再利用して、複数の連続改行文字を単一の改行文字に圧縮しました。