クラスで翻訳しているギリシャ語のテキストのリストを語ろうとしています。すべてのWordが独自の行に表示されるように、すべてのスペースまたはタブ文字を段落記号に置き換えたいと思います。誰も私にsedコマンドを与えて、私がやっていることを説明できますか?私はまだセドアウトしようとしています。
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
その意味:
[[:blank:]]
は、単一のスペース文字または単一のタブ文字のいずれかに一致します。[[:space:]]
を使用して、単一の空白文字(通常、スペース、タブ、改行、キャリッジリターン、フォームフィード、および垂直タブ)に一致させます。+
量指定子は、1つ以上の前のパターンと一致することを意味します。[[:blank:]]+
は、すべてスペースまたはタブである1つ以上の文字のシーケンスです。\n
は、必要な改行です。/g
修飾子は、1回だけではなく、できるだけ多くの回数置換を実行することを意味します。-E
オプションは、sedにPOSIX拡張正規表現構文、特にこの場合は+
量指定子を使用するように指示します。 -E
がない場合、sedコマンドはsed -e 's/[[:blank:]]\+/\n/g'
になります。 (単純な\+
ではなく+
を使用していることに注意してください。)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]*
)を付けてシミュレートします。\n
を理解しないと仮定すると、コマンドラインに逐語的に含める必要があります。\
とコマンドの最初の行の終わりは、直後の改行をエスケープする継続マーカーであり、コマンドの残りは次の行にあります。上記のコマンドはすべて、二重引用符(''
)ではなく、単一引用符(""
)を使用していました。考慮してください:
$ echo '\\\\' "\\\\"
\\\\ \\
つまり、シェルは、二重引用符付き文字列と比較して、単一引用符付き文字列に異なるエスケープ規則を適用します。通常、正規表現に共通するすべてのバックスラッシュをsingle引用符で保護します。
これを行うポータブルな方法は次のとおりです。
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など)で動作させる場合は、 、よりポータブルなオプションを選択することをお勧めします。
いずれかのプラットフォームでの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
オプション1
echo $(cat testfile)
オプション2
tr ' ' '\n' < testfile
これは仕事をするはずです:
sed -e 's/[ \t]+/\n/g'
[ \t]
はスペースを意味しますORタブ。任意の種類のスペースが必要な場合は、\s
。
[ \t]+
は、必要な数のスペースORタブ(ただし、少なくとも1つ)
s/x/y/
は、パターンxをyに置き換えることを意味します(ここでは\n
は改行です)
末尾のg
は、すべての行で何度も繰り返す必要があることを意味します。
POSIX [[:blank:]]
を使用して、水平方向の空白文字に一致させることができます。
sed 's/[[:blank:]]\+/\n/g' file
または、[[:space:]]
の代わりに[[:blank:]]
を使用することもできます。
例:
$ echo 'this is a sentence' | sed 's/[[:blank:]]\+/\n/g'
this
is
a
sentence
xargs
でもできます:
cat old | xargs -n1 > new
または
xargs -n1 < old > new
gawk
を使用:
gawk '{$1=$1}1' OFS="\n" file