web-dev-qa-db-ja.com

Bashで円記号をコンマに置き換える

ファイルを1行ずつ読んでいるスクリプトを書いてみました。バックスラッシュ(\)をコンマ(、)に置き換えることになっています。

入力ファイルは次のとおりです。

1,2,3,WORKSTATION1\A,5
1,2,3,WORKSTATION2\B,5
1,2,3,WORKSTATION1\C,5
1,2,3,WORKSTATION1\D,5
1,2,3,WORKSTATION1\E,5
1,2,3,WORKSTATION1\F,5
1,2,3,WORKSTATION1\G,5

私が書いたコードは次のとおりです。

#!/bin/bash

cat $1 | while read -r line
do
ln=$(echo $line | xargs | sed 's/\\/,/g' )
echo $ln
done

echo Done!

./script.sh file.csvを実行すると、次の出力が表示されます。

1,2,3,WORKSTATION1A,5
1,2,3,WORKSTATION2B,5
1,2,3,WORKSTATION1C,5
1,2,3,WORKSTATION1D,5
1,2,3,WORKSTATION1E,5
1,2,3,WORKSTATION1F,5
1,2,3,WORKSTATION1G,5
Done!

一方、私は次のような出力を期待しています。

1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
Done!

また、sed 's/\\/,/g'tr "\\" ","に置き換えてみましたが、役に立ちません。変更が必要ですか?

3
Mandar Shinde

これを試しましたか

# cat a.txt 
1,2,3,WORKSTATION1\A,5
1,2,3,WORKSTATION2\B,5
1,2,3,WORKSTATION1\C,5
1,2,3,WORKSTATION1\D,5
1,2,3,WORKSTATION1\E,5
1,2,3,WORKSTATION1\F,5
1,2,3,WORKSTATION1\G,5

# sed -e 's/\\/,/g' a.txt 

1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
8

試したのと同じスクリプトを書くためのより良い方法は次のとおりです。

#!/bin/bash

while read -r line
do
  echo "$line" | sed 's/\\/,/g'
done < "$1"

echo Done!

もちろん、すべてを単純化して

#!/bin/bash

tr '\\' , < "$1"    
5
terdon

Bashでネイティブに行うことができます-${line/\\/,}を使用して最初のオカレンスを置き換えるか、${line//\\/,}を使用して\内の${line}のすべてのオカレンスを置き換えます(sed-g修飾子と同等):

while read -r line; do 
   echo "${line//\\/,}"
done < file.csv
1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
3
steeldriver

sedにプッシュするときに、シェルがこれらのバックスラッシュを食べないようにしてください。

sed 's/\\/,/g' <<\BS
1,2,3,WORKSTATION1\A,5
1,2,3,WORKSTATION2\B,5
1,2,3,WORKSTATION1\C,5
1,2,3,WORKSTATION1\D,5
1,2,3,WORKSTATION1\E,5
1,2,3,WORKSTATION1\F,5
1,2,3,WORKSTATION1\G,5
BS

#OUTPUT#

1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
3
mikeserv

ここにawkソリューションがあります、

$ awk -F'\' '{print $1","$2}' file.txt
1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
2
Avinash Raj