一重引用符で囲まれ、カンマで区切られた単語を含む行を列に変換

一重引用符で囲まれ、カンマで区切られた単語を含む行を列に変換

私はこのファイルを持っています:
'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

関連情報