パイプで区切られたファイルの1つのフィールドで内部二重引用符を置き換える方法

パイプで区切られたファイルの1つのフィールドで内部二重引用符を置き換える方法

PSVファイルがあります。

$ cat hello.txt 
123|"xy"|11|"sb" sri"|13|"bb" 
123|"xy"|11|"rss" "NIL"|13|"bb"   

4番目のフィールドでは、内部二重引用符を別の文字()に置き換えたいと思いますW

私が試した方法は次のとおりです。しかし、所望の結果が得られなかった。

$ sed '/"|/s/[^|]|/W|/4' hello.txt 
123|"xy"|11|"sb" sriW|13|"bb" 
123|"xy"|11|"rss" "NILW|13|"bb"  

hello.txt出力が以下のファイルと同じであることを望みます。

$ cat hello.txt 
123|"xy"|11|"sbW sri"|13|"bb" 
123|"xy"|11|"rssW WNIL"|13|"bb"

ベストアンサー1

他の観点からは、

123|"xy"|11|"sb" sri"|13|"bb" 
123|"xy"|11|"rss" "NIL"|13|"bb"

パイプで区切られた4番目のフィールドを抽出しようとしています。

cut -f4 -d'|' < test

"sb" sri"
"rss" "NIL"

フィールド内に引用符がある可能性があるため、外側のペアを削除してください。

cut -f4 -d'|' < test | sed -e 's/^"\(.*\)"/\1/g'

sb" sri
rss" "NIL

残りの引用符をすべてW記号に置き換えます。

cut -f4 -d'|' < test | sed -e 's/^"\(.*\)"/\1/g' | tr '"' 'W'

sbW sri
rssW WNIL

最後に、外部引用符をもう一度交換してください。

cut -f4 -d'|' < test | sed -e 's/^"\(.*\)"/\1/g' | tr '"' 'W' \
    | sed -e 's/\(.*\)/"\1"/g'

"sbW sri"
"rssW WNIL"

おすすめ記事