連続する2つのCRを1つに置き換える

連続する2つのCRを1つに置き換える

cat -e file.txt与える:

{"yellow":"mango"}^M$
^M$
{"yellow":"banana"}^M$
^M$
{"yellow":"blabla"}^M$
^M$

そして私はただ以下を持ちたいのです:

{""yellow":"mango"}^M$
{"yellow":"banana"}^M$
{"yellow":"blabla"}^M$

フォルダー内の txt 拡張子を持つすべてのファイルに対して実行します。そこで試してみました:

find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/^M$^M$/^M$/g"

無駄でした。誰かもっと良いアイデアを持っていますか?

head -n 3 file.txt | od -bc

結果:

0000000 173 042 171 145 154 154 157 167 042 072 042 155 141 156 147 157
          {   "   y   e   l   l   o   w   "   :   "   m   a   n   g   o
0000020 042 175 015 012 015 012 173 042 142 141 142 141 142 042 072 042
          "   }  \r  \n  \r  \n   {   "   b   a   b   a   b   "   :   "
0000040 155 141 156 147 157 042 175 015 012
          m   a   n   g   o   "   }  \r  \n
0000051

これ:

awk 1 RS='\r\n' ORS= < file.txt

新しい行を完全に削除します (これは良くありません。各行の連続する 2 行のうち 1 行を保持したいのですが、何らかの処理が行われます)。

答え1

を使用できますsed -z 's/\r\n\r\n/\r\n/g'

通常、sed一度に 1 行のみ動作します。 この-zオプションを使用すると、テキスト ファイルでは通常存在しないバイトsedで区切られた行に対して動作し0、ファイル全体が 1 行として扱われ、改行を置き換えることができます。

(見つかったスタックオーバーフローおよび説明を追加しました)

答え2

改行のみを含む行を削除することもできます。

  • GNU Sed の場合:

    sed '/^\r$/d' file
    
  • 最小限だが POSIX 準拠のマシンの場合 (ここでは Printf を使用してキャリッジ リターンを生成する必要があります):

    sed "/^$(printf "\r")$/d" file
    

^行頭と最後$の行末 ( \n) に一致します。

例えば:

$ cat -e file
AB^M$
^M$
CB^M$
^M$
$ sed '/^\r$/d' file|cat -e
AB^M$
CB^M$

答え3

すべての空白行を削除しても問題ない場合は、次のようにします。

perl -wlne '/\S/ and print' old_file > new_file

ファイルを上書きしたい場合は、-i(インプレース) スイッチを使用できます。

perl -wlni.bak -e '/\S/ and print' file1 file2 file3 ...

上記の行は、元のファイルをファイルとしてコピーします*.bak。バックアップが必要ない場合は、.bak次のようにこの部分を省略できます。

perl -wlni -e '/\S/ and print' file1 file2 file3 ...

(ワイルドカードも使用できるので、 の代わりに とfile1 file2 file3 ...書くこともできますfile*。)

この方法の利点は、ファイルごとに 1 回実行するのではなく、すべてのファイルを一度に変更できることです。

ただし、覚えておいてください: これは、少なくとも 1 つの空白以外の文字を含む行のみを保持します。したがって、行が 5 つのスペース、タブ、キャリッジ リターン、および改行文字のみで構成されている場合は、保持されません。

答え4

Raku (以前は Perl6 と呼ばれていた言語) を使用する

~$ raku -ne '.put if /\S/ ;' test_blank.txt
{"yellow":"mango"}
{"yellow":"banana"}
{"yellow":"blabla"}

上記の例では、空白以外の文字 (\S空白以外の 1 文字に一致) を含む行のみを出力します。非常に読みやすいバージョンを以下に示します。

~$ raku -ne '.put if .chars;' test_blank.txt
{"yellow":"mango"}
{"yellow":"banana"}
{"yellow":"blabla"}

ありがとう。

https://raku.org
https://rakudo.org/downloads

関連情報