bugfix> linux > 投稿

2つの改行文字を置き換えるにはどうすればよいですか \n\n nullで \0 bashの文字、またはその逆?

私はそれを見る td 1つの改行をnullに置き換えることはできますが、2つの連続する改行文字を置き換えることはできません。私は試した sed 、しかしそれは可能ではないようです。 sed 「行ベース」のようで、改行文字をいじるのは好きではありません。

これを実行したい理由は、レコードが空の行で区切られているファイルを、 sort -z 。たとえば、与えられたファイル

record b
foo bar
record a
zee bee
dee da

そのファイルを、空白行をnullに置き換える変換にパイプしてから、にパイプしたい sort -z 、次にnullを空白行に置き換え、最後に吐き出します

record a
zee bee
dee da
record b
foo bar

回答 2 件
  • 予備メモ

    タイトルはあなたが試みた解決策について尋ねます。あなたは質問の本文で本当の問題を説明しました。 XY問題を比較します。この回答は、「空の行をnullに、またはその逆に置き換える」とは限らないため、タイトルを解決しません。ヌルバイトを適切な場所に挿入してから削除します(私が簡単だと思うので)。このようにして、本体を解決します。


    解決

    私のこの他の答えを調整しましょう:行のパックをアルファベット順に並べ替えます。あなたの質問は私が答えたものとほとんど同じです。

    そこでは、各レコードは次のようなヘッダーで始まります [ProfileX] 。あなたの場合、空の行がそのようなヘッダーであると言うことができますが、最初のレコードはそれを見逃しています。リンクされたソリューションを使用するには、事前に最初のヘッダーを追加し、最後に最初のヘッダーを削除する必要があります。

    sed -e '1 s/^/\n/' -e '1 ! s/^$/\x00/' | sort -z | tr -d '\0' | sed -e '1 d'
    #   ^^^^^^^^^^^^^^                                                           add missing header
    #                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                apply the other answer (adjusted)
    #                                                               ^^^^^^^^^^^^ remove excessive header
    
    

    この変更を行わないと、入力の最初のレコードが出力に表示され、その前に空行が表示されません。これは、出力の最初のレコードでない限り、問題になります。また、出力の最初のレコードには、その前にヘッダー(存在する場合)があります。これは、入力の最初のレコード(ヘッダーのないレコード)でない限り、問題になります。

  • #!/bin/bash
    original=/tmp/xxxx.txt
    infile=${original}.unsorted
    outfile=${original}.sorted
    delim='#'
    if grep -iq $delim $original ;then
      echo "Delimiter $delim found in $original"
      echo "Please chose a different delimiter and try again"
      exit 1
    fi
    # Not sure if line endings are Windows (CR+LF) or Linux (LF), so...
    tr -d '\r' <$original >$infile
    while read a ;do
      if [ "$a" = "" ] ;then
        echo
      else 
        echo -n $a$delim
      fi
    done <$infile | sort | tr $delim '\n' >$outfile
    
    
    ~# cat $original
    record b
    foo bar
    record a
    zee bee
    dee da
    
    
    ~# cat $outfile
    record a
    zee bee
    dee da
    record b
    foo bar
    
    

あなたの答え