シェルスクリプトのsedの説明

シェルスクリプトのsedの説明

実際には、テキストファイルから各単語の頻度を生成するのに役立つコードをオンラインで見つけましたが、誰かがこれを行う方法を正確に説明したいと思います。

特にsedコマンドです。私はbashに最初に触れ、すべての区切り文字()が何をしているのかを知る必要があるからですs/\(.*\)/\L\1/

コードは次のとおりです。

cat EnglishText.txt
sed 's/\.//g;s/\(.*\)/\L\1/;s/\ /\n/g' EnglishText.txt | sort | uniq -c

sedの後に正確に何が起こるのか知りたいです。 uniq -cとの並べ替えは理解していますが、マッチングなどで何が起こっているのか知りたいです。これは少し奇妙であることがわかりますが、もう一度これについて非常に不慣れに感じます。

同じ質問の文脈で

sed  's/\([0-9]*\).*/\1/'

それはどういう意味ですか?

ベストアンサー1

スクリプトsedは3つの代替コマンドで構成されています。置換コマンドは、s/old/new/テキスト内の正規表現に一致oldする項目を検索し、置換する形式を取りますnewgコマンドの後にaがある場合、この置換は繰り返し実行されます(「グローバル」)。最初はピリオドを削除します。 2番目はテキストを小文字にします。 3番目は、各単語を1行に配置します。もっと詳しく:

  • s/\.//g

    これは入力のピリオドと一致し、何も置き換えません。

  • s/\(.*\)/\L\1/

    これは入力内のすべての項目と一致し、同じコンテンツの小文字バージョンに置き換えられます。

  • s/\ /\n/g

    これはスペースを改行文字に置き換えます。これは、各単語を別々の行に配置する効果があります。

はい

ピリオドが削除され、すべての単語が小文字で別々の行に配置されます。

$ echo 'This test is this test.' | sed 's/\.//g;s/\(.*\)/\L\1/;s/\ /\n/g'
this
test
is
this
test

このフォームはソートと計算に適しています。

$ echo 'This test is this test.' | sed 's/\.//g;s/\(.*\)/\L\1/;s/\ /\n/g' | sort | uniq -c
      1 is
      2 test
      2 this

改善する

書かれているように、sedスクリプトは他の句読点文字(または?"!タブなど)に対して何もしません。上記のコードを少し変更すると、すべての問題を処理できます。

$ echo 'This "test(?)" is this test!' | sed 's/[[:punct:]]//g; s/.*/\L&/; s/[[:space:]]/\n/g' | sort | uniq -c
      1 is
      2 test
      2 this

これは、いくつかのマイナーな変更のみを除いて、元のコマンドと同じタイプの代替コマンドを使用します。

  1. s/[[:punct:]]//gすべての句読点を削除してください。

  2. s/.*/\L&/すべての大文字を小文字に変換します。

  3. s/[[:space:]]/\n/gすべてのスペースを改行に置き換えます。

付録

行が数字で始まる場合は、sed 's/\([0-9]*\).*/\1/'その数字を保持し、その後のすべての項目を削除します。他のすべての行は削除されます。たとえば、

$ echo '123 tests' | sed  's/\([0-9]*\).*/\1/'
123
$ echo 'There are 123 tests' | sed  's/\([0-9]*\).*/\1/'

おすすめ記事