1. ホーム
  2. regex

すべての空白を改行/段落記号に置き換えて単語リストを作成する

2023-12-10 11:21:51

質問

授業で翻訳するギリシャ語のテキストのボキャブラリーリストを作ろうとしています。私は、すべてのスペースまたはタブ文字を段落マークに置き換え、すべての単語がそれ自身の行に表示されるようにしたいのです。どなたかsedコマンドを教えてください。私はまだsedを理解しようとしています。

どのように解決するのですか?

最近のバージョンの sed では、標準入力を編集して、標準出力に

$ echo 'τέχνη βιβλίο γη κήπος' | sed -E -e 's/[[:blank:]]+/\n/g'
τέχνη
βιβλίο
γη
κήπος

単語帳のファイルが lesson1lesson2 のように、sed の標準出力をファイルにリダイレクトします。 all-vocab と共に

sed -E -e 's/[[:blank:]]+/\n/g' lesson1 lesson2 > all-vocab

何を意味するのか

  • 文字クラス [[:blank:]] は,スペース1文字または タブ文字にマッチします。
    • 使用する [[:space:]] を使用します(一般的にはスペース、タブ、改行、キャリッジリターン、フォームフィード、垂直タブ)。
    • + という量詞は は一つ以上のパターンにマッチします。 .
    • では [[:blank:]]+ は、すべてスペースまたはタブである1つ以上の文字のシーケンスです。
  • \n は、あなたが必要とする改行です。
  • /g 修飾子は、置換を一度だけでなく何度も行うことを意味します。
  • -E オプションは POSIX 拡張正規表現構文を使うように指示し、 特にこの場合 + という量詞を使います。がなければ -E がない場合、sed コマンドは次のようになります。 sed -e 's/[[:blank:]]\+/\n/g' . (ただし \+ ではなく、単純な + .)

Perl 互換の正規表現

Perl互換の正規表現とPCREに対応したsedに慣れている方は \s+ のように、少なくとも一文字の空白文字がある場合にマッチします。

sed -E -e 's/\s+/\n/g' old > new

または

sed -e 's/\s\+/\n/g' old > new

これらのコマンドは、ファイル old という名前のファイルに結果を書き込みます。 new という名前のファイルに書き出す。

最大限のポータビリティ、最大限のクルーティネス

sed のほぼすべてのバージョンに戻るには バージョン 7 Unix からのほとんどすべてのバージョンに戻ると、コマンドの呼び出しはもう少しバロック的です。

$ echo 'τέχνη βιβλίο γη κήπος' | sed -e 's/[ \t][ \t]*/\
/g'
τέχνη
βιβλίο
γη
κήπος

注意事項

  • ここでは、謙譲語の存在すら想定していません。 + という量詞の存在を仮定せず、スペースかタブをひとつだけ使ってシミュレートしています ( [ \t] )の後に、0個以上( [ \t]* ).
  • 同様に、sedが理解できないと仮定すると \n を理解しないと仮定すると、コマンドライン上でそれをそのまま含める必要があります。
    • \ とコマンドの最初の行の終わりは、直後の改行をエスケープする継続マーカーであり、コマンドの残りは次の行にあります。
      • 注意 エスケープされた改行の前には空白があってはならない。つまり、最初の行の終わりは でなければなりません。 バックスラッシュの後に行末がなければなりません。
    • このエラーを起こしやすいプロセスは、なぜ世界が可視文字に移行したかを理解するのに役立ちます。また、コピー アンド ペーストでコマンドを試す際には、いくらかの注意を払う必要があります。

バックスラッシュとクォートに関する注意

上記のコマンドはすべてシングルクォート ( '' )ではなく、ダブルクォート( "" ). と考えてください。

$ echo '\\\\' "\\\\"
\\\\ \\

つまり、シェルはダブルクォート文字列と比較して、シングルクォート文字列に異なるエスケープルールを適用します。正規表現でよく使われるバックスラッシュは、通常 シングル 引用符で囲みます。