1行に1単語ずつインポートするためにパターンを変更し、複数の単語を含むファイルを整理しようとします。
次のコマンドラインを使用して結果を取得できます。
sed -e '/^[[:space:]]*$/ d' \ # remove empty line
-e 's/^[[:space:]]*//' \ # remove white space at the beginning
-e 's/[[:space:]]*$//' \ # remove white space at the ending (EOL)
-e 's/[[:space:]][[:space:]]*/\n/g' \ # convert blanks between words to newline
-e '$a\' # add a newline if missing at EOF
-e ..... # replace other patterns.
(最後の表現はファイルの末尾に改行文字を追加するには?)
アイデアは、小さなsedプログラムを使用してファイルを処理し(たとえば、特定のパターンを置き換える)、同時にファイル形式を指定することです。
表現を減らすために他のsed関数を使用できると確信しています。
挨拶
答え1
あなたはそれを使用することができますtr
:
tr -s "[[:blank:]]" "\n" < file | grep .
文字[:blank:]
クラスには水平スペースがすべて含まれます。-s
複数の文字の発生を1つに圧縮または減らします。
grep
空白行がある場合は削除してください。
答え2
この試み
sed -e 's/[[:space:]]/\n/g' | grep -v '^$'
どちらも使用しますgrep
がsed
、大丈夫です。 (sed
通常使用するシステムがある場合grep
)
答え3
sedではありませんが:
gawk length RS='[[:space:]]+' file
一連のスペースをレコード区切り文字として扱い、ヌル以外のすべてのレコードを印刷します。
答え4
OPは「シングルコール」の使用に固執しているようで、sed
次のようになります。
部分的なパターン空間を隠す絹語分割方法:
sed -n -e 's/^\W*//' -e 's/\(\W\+\)/\n/gp' words.txt
編集:@don_crisstiが指摘したように、この解決策は最初に単独で表示される単語を最初に印刷できず、ファイルに終了文字がない場合は出力の末尾に改行を挿入できないため、完全ではありません。改行。この問題を解決するには、以下の非常に見苦しいソリューションを参照してください。
最大の問題sed
は、各式が機能するパターン空間が-e
常に線として定義されることです。改行文字を挿入して最初の式と次の式の間の行構造を変更すると、処理されたデータで次の式は実行されません。
説明する:
まず、各行は先行スペース(存在する場合)に対して処理されます。それだけで構成されたラインは、パターン空間のライン長を維持しながら空のラインになります。
2番目の部分の鍵は、一部の人が「grepモード」と呼ぶ
-n
オプションと(印刷)コマンドの組み合わせです。これは、デフォルトで一致または変更された行のみを印刷する効果があります。出力が印刷されるのを防ぎ、一致および/または変更された行が印刷されるようにします。これにより、空白行が完全に印刷されるのを回避できます。予想されるからp
sed
-n
p
\W\+
最後のもの単語以外の文字と空白行は除外されます。以前は、式に一致した先行スペースが空行に変わりました。編集:説明するのを忘れました部族最初の表現のコマンドの意味
p
も重要です。各式には通常、パターンスペースが印刷され、それを印刷した式と同じように各行を表示できます。その式のいずれかが与えられた行を変更した場合は、変更があります。ただし、パターンスペースが印刷されていなくても変更された形式で後続の式に渡されるため、最後の式のみが表示されている間に、1つの入力行から始まる単一のパイプで実行される式を連結できます。
単語を空白ではなく文字のシーケンスとして考えることを好む場合は、ええ...はい。しかし、その定義には単なる単語以上のものが含まれます。これは単語ではなく空白ではないシーケンスです。ただし、これらを一致させて単語の代わりに別の行に印刷するには、次のようにします。
sed -n -e 's/^\s*//' -e 's/\(\s\+\)/\n/gp' words.txt
0バイトの交換方法
編集:@don_crisstiが単一の単語を持ち、EOFに改行がない行で指摘されている問題は、次のコマンドを使用して解決できます。あまりにも長くはありませんが、とんでもないほどハッキング的であることに加えて、私が知っている欠陥が1つ以上あります。つまり、その行に複数の単語がある場合、1行しかないファイルでは機能しません。この問題を解決するための1つのアイデアは、最後の行が最初の行であることを確認するために分岐を追加することです。これはプログラムをより複雑にします(そして時間がかかります:D)。これはコマンドです:
sed -rn 's/(\b|\W)+/\x0/g; s/^\x0//; s/\x0$//; s/\x0/\n/g; /^$/d; $! p; $ { s/$/\n/; P }'
説明する:
このコマンドは、次のプロセス中に機能します。
まず、単語以外の文字だけでなく、行の終わりや先頭(文字以外の幅がゼロのアサーション)などの単語境界がゼロバイトに置き換えられます。これには、単語の境界とそれに隣接する単語以外の文字シーケンス(該当する場所)も含まれます。
その後、各行の先頭と末尾からゼロバイトが削除されます。
その後、中間の各ゼロバイトが改行文字に置き換えられます。
結果として生じる空白行は、パターン空間から削除されます。現時点では、純粋な空行はありません。
現在のパターン空間のアドレスが最後のアドレスでない場合(つまり、最後の行にない場合)、単にその行を印刷します。
データの終わりに、私たちは2つのコマンドを実行します:
元のデータが改行で終わっていなくても、少なくとも1つの終了改行を持つように、現在のパターンスペースの末尾に改行を追加します。
現在のパターンスペースに含まれる最初の改行のみを印刷します。これには最大2つの改行があります。
ところで、私が見たこの問題に対する最も簡単な解決策は次のとおりです。
grep -o '\w\+' words.txt
または、スペースで始まる行を処理する必要がない場合:
fmt -1 words.txt