私はこのファイルを持っています:
'dog', 'cat', 'horse', 'turtle'
この行を次に変換したいと思います。
dog
cat
horse
turtle
カンマを区切り文字として使用し、trコマンドを使用すると、次のようにできます。
tr -s ',' '\n' < file
出力を含む
'dog'
'cat'
'horse'
'turtle'
ただし、区切り文字として使用すると機能しません', '
。
tr -s '\', \'' '\n' < file
一重引用符をエスケープするために二重バックスラッシュを使用しても、まだ機能しません。端末から得られる唯一の出力は>
。
目的の出力を得るために一重引用符を正しくエスケープする方法は?
答え1
入力を引用符付きCSVとして処理し、各カンマ区切り文字の後にスキップできるスペースを追加し、引用符で標準二重引用符の代わりに一重引用符を使用してcsvformat
データ型を再指定できます。
$ csvformat -S -q "'" -D $'\n' file
dog
cat
horse
turtle
これはcsvformat
、withを使用して-S
各区切り文字の後の最初の空白文字をスキップし、-q "'"
入力引用符文字を一重引用符に設定し、出力フィールド区切り文字を改行-D $'\n'
文字に設定します。
これによりファイルが再フォーマットされます。
埋め込み改行を使用するすべてのフィールドは、埋め込み二重引用符を含むフィールドと同様に、出力から引用されます。
答え2
tr
文字列ではなくコレクションに適用されます。第1グループの各第1シンボルは第2グループの第1シンボルに置き換えられ、第1グループの第2シンボルは全て第2グループの第2シンボルに置き換えられる式である。
2番目のグループに最初のグループより少ない数のシンボルがある場合、最初のグループで正しくペアになっていないすべてのシンボルは、2番目のグループの最後のシンボルに置き換えられます。
あなたはする必要があります
tr -s "\', " '\n' < file
各アポストロフィ、カンマ、スペースは改行文字で置き換えられますが、-sオプションはそれらをすべて単一のLFインスタンスに圧縮します。
答え3
$ awk -F"'" '{for (i=2;i<=NF;i+=2) print $i}' file
dog
cat
horse
turtle
答え4
使用sed
$ sed "s/\([^,]*\), /\1\n/g;s/'//g" input_file
dog
cat
horse
turtle