26

私は次の単語のリストを持っています:

name,id,3

私はそれをこのように二重引用符で囲む必要があります:

"name,id,3"

私は試しsed 's/.*/\"&\"/g'ました:

"name,id,3

二重引用符が1つだけあり、最後の二重引用符がありません。

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

4

7 に答える 7

26

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

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行末があるようです。dos2unix 最初にパイプで通します。

証拠:

$ 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"
于 2012-05-25T12:57:00.327 に答える
18

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

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

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

于 2012-05-25T13:32:41.587 に答える
11

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

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

または、次のようにBASHprintfを使用することをお勧めします。

printf '"%s"\n' $line
于 2012-05-25T13:32:56.347 に答える
7

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

 echo name,id,3 | awk '{print "\x22" $1 "\x22"}'
 "name,id,3"
于 2015-07-14T16:24:56.770 に答える
3

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

使用する

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

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

于 2018-04-16T09:55:34.943 に答える
-1

sedコマンドを使用する前に、エスケープ文字として\を使用すると、文字列に「」が出力されます。例として、以下のコマンドを使用して、テキストファイルの最初の行に同様の文字列を配置します。

var = "\"name,id,3\""
sed -i '1i' "$var" /tmp/out.txt
于 2020-11-26T13:46:15.620 に答える
-1

これは私のために働きます:

echo name,id,3 | sed 's/name,id,3/"name,id,3"/'
"name,id,3"
于 2021-12-18T03:34:20.027 に答える