30

Linux bash コマンドを使用して、ファイルからすべての制御文字を削除したいと考えています。

EOF (0x1A) のような制御文字がいくつかあり、特に別のソフトウェアでファイルをロードするときに問題を引き起こしています。これを削除したい。

これが私がこれまでに試したことです:

これにより、すべての制御文字がリストされます。

cat -v -e -t file.txt | head -n 10

^A+^X$
^A1^X$
^D ^_$
^E-^D$
^E-^S$
^E1^V$
^F%^_$
^F-^D$
^F.^_$
^F/^_$
^F4EZ$
^G%$

これにより、grep を使用してすべての制御文字が一覧表示されます。

$ cat file.txt | head -n 10 | grep '[[:cntrl:]]'
+
1

-
-
1
%
-
.
/

上記の cat コマンドの出力と一致します。

ここで、次のコマンドを実行して、制御文字を含まないすべての行を表示しましたが、上記と同じ出力 (制御文字を含む行) を表示しています。

$ cat file.txt | head -n 10 | grep '[^[:cntrl:]]'
+
1

-
-
1
%
-
.
/

16 進形式の出力は次のとおりです。

$ cat file.txt | head -n 10 | grep '[[:cntrl:]]' | od -t x2
0000000 2b01 0a18 3101 0a18 2004 0a1f 2d05 0a04
0000020 2d05 0a13 3105 0a16 2506 0a1f 2d06 0a04
0000040 2e06 0a1f 2f06 0a1f
0000050

ご覧のとおり、16 進値 0x01、0x18 は制御文字です。

tr コマンドを使用して制御文字を削除しようとしましたが、エラーが発生しました。

$ cat file.txt | tr -d "\r\n" "[:cntrl:]" >> test.txt
tr: extra operand `[:cntrl:]'
Only one string may be given when deleting without squeezing repeats.
Try `tr --help' for more information.

すべての制御文字を削除すると、ウィンドウで改行文字として使用される改行と改行も削除されます。「\r\n」のように必要なものだけを残して、すべての制御文字を削除するにはどうすればよいですか?

ありがとう。

4

4 に答える 4

10

次のように試してくださいgrep

grep -o "[[:print:][:space:]]*" in.txt > out.txt

タブ、改行、垂直タブ、フォーム フィード、キャリッジ リターン、スペースなどの句読点文字とスペース文字を含む英数字のみを印刷します。

制限を緩和し、制御文字( [:cntrl:]) のみを削除するには、次の方法で削除します。

tr -d "[:cntrl:]"

\n(の一部である)保持したい場合は[:cntrl:]、一時的に別のものに置き換えます。

cat file.txt | tr '\r\n' '\275\276' | tr -d "[:cntrl:]" | tr "\275\276" "\r\n"
于 2016-04-12T00:46:25.363 に答える