文字列から\ nを削除する方法

文字列から\ nを削除する方法

文字列の列23に\ nがあるタブ区切りのテキストファイルがあり、これは次の行に進みます。

スペースが有効なviでテキストファイルを開くと、DESCR2フィールドの値に文字列を区切る空白行があることがわかります。

文字列はタブで区切られた文字内に含まれており、\ nを削除し、1フィールドにある間に文字列をABC 123に連結しようとします。

私はこれを試しましたが、tr -d '\n' < file.txtすべての行を1行に置き換えます。この列から\n\nを削除したいと思います。

私も試してみましたが、うまくいきませんでしsed 's/\n\n//' file.txtた。 viで\ n \ nを検索して置き換えることができますが、sedを使用すると同じ結果を得ることはできません。

例:

\t"ABC\n
\n
123"\t

希望の出力:

\t"ABC 123"\t

ベストアンサー1

タブ文字をフィールド区切り文字として使用する正しい形式のCSVファイルがあるようです。示されている例のように、正しく引用されている限り、フィールドに改行を含めることができます。すべてのCSVパーサーはデータを読み取るのに問題はありません。

これらの改行文字を削除するには、次のCSVパーサーを使用できます。csvkit

次のサンプルファイルを使って作業します。

$ cat -t file.csv
col1^Icol2^Icol3
col1^I"ABC

123"^Icol3
col1^Icol2^Icol3

それぞれは^Iタブ文字です。 2行目の2番目のフィールドには2つの連続した改行文字が含まれており、これを単一の空白文字で安全に置き換えようとします。

私はCSVデータをJSON文書に変換するcsvjsonfromを使用しています。csvkitこれにより、データを変更するのに少し簡単になり、jqデータをCSV形式に変換するためにも使用できます。

$ csvjson -t -H file.csv | jq -r '.[] | [ .[] | values |= gsub("\n\n";" ") ] | @csv'
"col1","col2","col3"
"col1","ABC 123","col3"
"col1","col2","col3"

ここで使用されるコマンドは、csvjsonCSVファイルの各行をJSONオブジェクトに変換します。この-tオプションは、入力がタブ文字を区切り文字として使用し、列見出しが-Hないことをツールに通知します。

JSONオブジェクトを配列に入れて読み取り、値を抽出します(元のCSVファイルにはヘッダーがないか、質問で述べたように少なくともないため、データはなどのキーにjq割り当てられます)。スペースを使用して簡単な置換を適用します。連続した改行のすべてのペアを交換します。abcgsub()

gsub()明らかに、上記の正規表現を変更し\n+て、連続した改行文字を単一の空白文字に置き換えることができます。

その後、オペレータは@csvCSV出力形式の配列形式でデータセットを受け取ります。

csvformatデフォルトのフィールド区切り文字をコンマからタブに戻すには-T(タブ区切り出力の場合)および(CSV入力にヘッダーなし)オプションを使用して-H結果をパイプします。

$ csvjson -t -H file.csv | jq -r '.[] | [ .[] | values |= gsub("\n\n";" ") ] | @csv' | csvformat -T -H
col1    col2    col3
col1    ABC 123 col3
col1    col2    col3

csvformat引用が必要なフィールドは自動的に引用されます。

このcsvformatツールも同様ですcsvkit


Noteで作成した中間JSON文書はcsvjson次のとおりです(ローマ化jq)。

[
  {
    "a": "col1",
    "b": "col2",
    "c": "col3"
  },
  {
    "a": "col1",
    "b": "ABC\n\n123",
    "c": "col3"
  },
  {
    "a": "col1",
    "b": "col2",
    "c": "col3"
  }
]

おすすめ記事