-1

次のようなファイルがあります。

my line - some words & text
oh lóok i've got some characters

それを「正規化」して、単語以外のすべての文字を削除したいと思います。私はこのようなもので終わりたいです:

mylinesomewordstext
ohlóokivegotsomecharacters

現在、コマンド ラインで Linux を使用しています。使用できるワンライナーがあることを願っています。

私はこれを試しました:

cat file | perl -pe 's/\W//'

しかし、これですべての改行が削除され、すべてが 1 行になりました。に改行を含めないように Perl に指示できる方法はあり\Wますか? それとも何か他の方法がありますか?

4

5 に答える 5

8

\wこれにより、または一致しない文字が削除されます\n

cat file | perl -C -pe 's/[^\w\n]//g'
于 2009-09-09T11:09:10.180 に答える
4

@sth のソリューションでは Perl を使用していますが、これは (少なくとも私のシステムでは) Unicode と互換性がないため、アクセント付きの o 文字が失われます。

一方、sed はUnicode と互換性があり (このページのリストによると)、正しい結果が得られます。

$ sed 's/\W//g' a.txt
mylinesomewordstext
ohlóokivegotsomecharacters
于 2009-09-09T11:32:08.317 に答える
2

Perl では、-l スイッチを追加するだけで、すべての print() の末尾に改行を追加して改行を再追加できます。

 perl -ple 's/\W//g' file

は必要ないことに注意してくださいcat

于 2009-09-10T15:10:28.563 に答える
1

前の応答は「ó」文字をエコーし​​ません。少なくとも私の場合は。

sed 's/\W//g' file
于 2009-09-09T11:30:17.087 に答える
1

シェル スクリプトのベスト プラクティスでは、1 文字の置換には sed ではなく tr プログラムを使用するように指示されています。長い文字列を置き換える場合は、明らかに sed を使用してください。

tr -d '[:blank:][:punct:]' < ファイル

時間とともに実行すると、次のようになります。

実 0m0.003s
ユーザー 0m0.000s
システム 0m0.004s

sed answer (sed -e 's/\W//g' ファイル) を時間とともに実行すると、次のようになります。

実 0m0.003s
ユーザー 0m0.004s
システム 0m0.004s

「大きな」違いではありませんが、より大きなデータ セットに対して実行すると違いに気付くでしょう。また、cat の出力を tr にパイプせず、代わりに I/O リダイレクションを使用していることにも注意してください (生成するプロセスが 1 つ少なくなります)。

于 2009-09-09T17:25:05.633 に答える