web-dev-qa-db-ja.com

SEDまたはAWKの行に二重引用符を追加するにはどうすればよいですか?

次の単語リストがあります。

name,id,3

次のように二重引用符で囲む必要があります。

"name,id,3"

私が試してみました sed 's/.*/\"&\"/g'および得た:

"name,id,3

二重引用符が1つしかなく、終了二重引用符がない。

私も試しましたawk {print "\""$1"\""}はまったく同じ結果になります。私は助けが必要です。

21
minerals

入力ファイルの行末に改行があります。それらを削除するには、ファイルでdos2unixを使用する必要があります。またはこれを行うことができます:

sed 's/\(.*\)\r/"\1"/g'

キャリッジリターンが削除され、引用符が追加されます。

これを使用して、入力を次の場所にパイプします。

sed 's/^/"/;s/$/"/'

^は行頭のアンカーであり、$は行末のアンカーです。 sed行では、行の開始と終了をそれぞれ""に置き換えています。

例:

$ echo -e "name,id,2\nname,id,3\nname,id,4"|sed 's/^/"/;s/$/"/'
"name,id,2"
"name,id,3"
"name,id,4"

sedなし:

$ echo -e "name,id,2\nname,id,3\nname,id,4"
name,id,2
name,id,3
name,id,4

ファイルにDOSの行末があるようです。パイプを使用してdos2unixfirstにパイプしてください。

証明:

$ cat test.txt
name,id,2
name,id,3
name,id,4
$ sed 's/^/"/;s/$/"/' test.txt
"name,id,2
"name,id,3
"name,id,4
$ cat test.txt|dos2unix|sed 's/^/"/;s/$/"/'
"name,id,2"
"name,id,3"
"name,id,4"
21
0xC0000022L

次のように、sedの代わりにawkを使用できます。

line='name,id,3'
echo $line | awk '{printf("\"%s\"\n", $0);}'

または、次のようにBASH printfを使用することもできます。

printf '"%s"\n' $line
10
anubhava

私が見つけた最も簡単な方法は、二重引用符にHEXコードを使用することです。

 echo name,id,3 | awk '{print "\x22" $1 "\x22"}'
 "name,id,3"
5
soulBleach

@Dennisソリューションと同様に、

使用する

sed 's/\(.*\)/"\1"/g'

「\ r」を探す必要はありません。これにより、すべての文字列に二重引用符が適用されます。これには、入力ファイルでdos2unixを実行する必要はありません。

2
thanga