file.txt を Bash 配列として読み取る必要があります。その後、スペース、二重引用符、各項目の最初のカンマを除くすべて。これが私がどれだけ離れてきたかです:
$ cat file.txt
10,this
2 0 , i s
30,"all"
40,I
50,n,e,e,d,2
60",s e,e"
$ cat script.sh
#!/bin/bash
readarray -t ARRAY<$1
ARRAY=( "${ARRAY[@]// /}" )
ARRAY=( "${ARRAY[@]//\"/}" )
for ELEMENT in "${ARRAY[@]}";do
echo "|ELEMENT|$ELEMENT|"
done
$ ./script.sh file.txt
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,n,e,e,d,2|
|ELEMENT|60,se,e|
これはカンマを除いて素晴らしい動作します。この猫にスキンを適用する方法はいくつかありますが、これはより大きなスクリプトの一部なので、ここに到達するためにパラメータ置換を使用したいと思います。
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|
パラメータ置換によってこれを達成できますか?
ベストアンサー1
bash
私が知る限り、その出力を生成するために配列として読む必要はありません。
$ sed 's/[ "]//g; s/,/ /; s/,//g; s/ /,/; s/.*/|ELEMENT|&|/' <file
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|
このsed
式はスペースと二重引用符を削除し、最初のカンマをスペースに置き換え(文字列にスペースがない場合)、他のすべてのカンマを削除し、最初のカンマを復元し、追加データを前に追加します。
またはGNUを使用してくださいsed
。
sed 's/[ "]//g; s/,//2g; s/.*/|ELEMENT|&|/' <file
(標準sed
では、コマンドフラグの組み合わせはサポートされていません。)2
g
s