web-dev-qa-db-ja.com

すべての空白を改行/段落記号に置き換えて、Wordリストを作成します

クラスで翻訳しているギリシャ語のテキストのリストを語ろうとしています。すべてのWordが独自の行に表示されるように、すべてのスペースまたはタブ文字を段落記号に置き換えたいと思います。誰も私にsedコマンドを与えて、私がやっていることを説明できますか?私はまだセドアウトしようとしています。

62
DavidR

Sedの最新バージョンでは、標準入力を編集して、標準出力を生成します。

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

語彙がlesson1およびlesson2という名前のファイルにある場合、sedの標準出力をファイルall-vocabにリダイレクトします。

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

その意味:

  • character class[[:blank:]]は、単一のスペース文字または単一のタブ文字のいずれかに一致します。
    • 代わりに[[:space:]]を使用して、単一の空白文字(通常、スペース、タブ、改行、キャリッジリターン、フォームフィード、および垂直タブ)に一致させます。
    • +量指定子は、1つ以上の前のパターンと一致することを意味します
    • したがって、[[:blank:]]+は、すべてスペースまたはタブである1つ以上の文字のシーケンスです。
  • 置換の\nは、必要な改行です。
  • 末尾の/g修飾子は、1回だけではなく、できるだけ多くの回数置換を実行することを意味します。
  • -Eオプションは、sedにPOSIX拡張正規表現構文、特にこの場合は+量指定子を使用するように指示します。 -Eがない場合、sedコマンドはsed -e 's/[[:blank:]]\+/\n/g'になります。 (単純な\+ではなく+を使用していることに注意してください。)

Perl互換の正規表現

Perl互換の正規表現とPCRE対応のsedに精通している場合は、\s+を使用して、次のように少なくとも1つの空白文字の実行に一致させます

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

または

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

これらのコマンドは、ファイルoldから入力を読み取り、現在のディレクトリのnewという名前のファイルに結果を書き込みます。

最大の携帯性、最大の粗さ

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

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

ノート:

  • ここでは、控え目な+量指定子の存在すら想定せず、単一のスペースまたはタブ([ \t])の後にゼロ個以上([ \t]*)を付けてシミュレートします。
  • 同様に、sedが改行の\nを理解しないと仮定すると、コマンドラインに逐語的に含める必要があります。
    • \とコマンドの最初の行の終わりは、直後の改行をエスケープする継続マーカーであり、コマンドの残りは次の行にあります。
      • 注:エスケープされた改行の前に空白があってはなりません。つまり、最初の行の終わりはexactlyバックスラッシュの後に行末が続く必要があります。
    • このエラーが発生しやすいプロセスは、世界が目に見えるキャラクターに移動した理由を理解するのに役立ちます。コピーアンドペーストでコマンドを試してみるには注意が必要です。

バックスラッシュと引用符に関する注意

上記のコマンドはすべて、二重引用符('')ではなく、単一引用符("")を使用していました。考慮してください:

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

つまり、シェルは、二重引用符付き文字列と比較して、単一引用符付き文字列に異なるエスケープ規則を適用します。通常、正規表現に共通するすべてのバックスラッシュをsingle引用符で保護します。

93
Greg Bacon

これを行うポータブルな方法は次のとおりです。

sed -e 's/[ \t][ \t]*/\
/g'

これは、バックスラッシュとスラッシュgの間の実際の改行です。多くのsed実装は\nを知らないため、リテラルの改行が必要です。改行の前のバックスラッシュは、sedが改行について混乱するのを防ぎます。 (sedスクリプトでは、コマンドは通常改行で終了します)

GNU sedを使用すると、置換で\nを使用でき、正規表現で\ sを使用できます。

sed -e 's/\s\s*/\n/g'

GNU sedは、-rフラグを指定すると「拡張」正規表現(Perlスタイルではなくegrepスタイル)もサポートするため、+を使用できます。

sed -r -e 's/\s+/\n/g'

これがLinux専用の場合は、おそらくGNUコマンドを使用できますが、GNU以外のsedを使用するシステム(BSD、Mac OS-Xなど)で動作させる場合は、 、よりポータブルなオプションを選択することをお勧めします。

56

いずれかのプラットフォームでのsed breakの上記のすべての例。 Macに同梱されているsedのバージョンでは動作しません。

ただし、Perlの正規表現は、Perlがインストールされているどのマシンでも同じように機能します。

Perl -pe 's/\s+/\n/g' file.txt

出力を保存する場合:

Perl -pe 's/\s+/\n/g' file.txt > newfile.txt

単語の一意の出現のみが必要な場合:

Perl -pe 's/\s+/\n/g' file.txt | sort -u > newfile.txt
9
Earl Ruby
  1. オプション1

    echo $(cat testfile)
    
  2. オプション2

    tr ' ' '\n' < testfile
    
6
RAJ

これは仕事をするはずです:

sed -e 's/[ \t]+/\n/g'

[ \t]はスペースを意味しますORタブ。任意の種類のスペースが必要な場合は、\s

[ \t]+は、必要な数のスペースORタブ(ただし、少なくとも1つ)

s/x/y/は、パターンxをyに置き換えることを意味します(ここでは\nは改行です)

末尾のgは、すべての行で何度も繰り返す必要があることを意味します。

4

POSIX [[:blank:]]を使用して、水平方向の空白文字に一致させることができます。

sed 's/[[:blank:]]\+/\n/g' file

または、[[:space:]]の代わりに[[:blank:]]を使用することもできます。

例:

$ echo 'this  is a sentence' | sed 's/[[:blank:]]\+/\n/g'
this
is
a
sentence
4
Avinash Raj

xargsでもできます:

cat old | xargs -n1 > new

または

xargs -n1 < old > new
2
FranMowinckel

gawkを使用:

gawk '{$1=$1}1' OFS="\n" file
0
ghostdog74