43

我想将每一行放在引号内,例如:

abcdefg
hijklmn
opqrst

转换成:

"abcdefg"
"hijklmn"
"opqrst"

如何在 Bash shell 脚本中执行此操作?

4

8 回答 8

44

使用awk

awk '{ print "\""$0"\""}' inputfile

使用纯 bash

while read FOO; do
   echo -e "\"$FOO\""
done < inputfile

whereinputfile将是一个包含不带引号的行的文件。

如果您的文件有空行,awk绝对是要走的路:

awk 'NF { print "\""$0"\""}' inputfile

NF告诉awk仅当字段数大于零(行不为空)时才执行打印命令。

于 2013-06-07T19:22:34.870 回答
13

我使用以下命令:

xargs -I{lin} echo \"{lin}\" < your_filename

获取标准输入(从您的xargs文件重定向)并一次将一行传递给{lin}占位符,然后在下一个执行命令,在这种情况下是echo带有转义的双引号。

您可以使用-ixargs 的选项来省略占位符的名称,如下所示:

xargs -i echo \"{}\" < your_filename

在这两种情况下,您的 IFS 必须为默认值或'\n'至少为默认值。

于 2014-03-25T00:26:49.117 回答
9

使用 sed:

sed -e 's/^\|$/"/g' file

如果文件包含空行,则需要更多的努力。

于 2013-06-07T19:21:11.987 回答
8

这个 sed 也应该适用于忽略空行:

sed -i.bak 's/^..*$/"&"/' inFile

或者

sed 's/^.\{1,\}$/"&"/' inFile
于 2013-06-07T19:59:37.330 回答
3

我认为 sed 和 awk 是最好的解决方案,但如果你只想使用 shell,这里有适合你的小脚本。

#!/bin/bash

chr="\""
file="file.txt"
cp $file $file."_backup"
while read -r line
do
 echo "${chr}$line${chr}"
done <$file > newfile
mv newfile $file
于 2013-06-07T19:22:49.740 回答
3
paste -d\" /dev/null your-file /dev/null

(不是最好看的,但可能是最快的)

现在,如果输入可能包含引号,您可能需要用反斜杠转义它们(然后也转义反斜杠),例如:

sed 's/["\]/\\&/g; s/.*/"&"/' your-file
于 2013-06-07T21:19:20.560 回答
0

这个答案对我有用mac terminal

$ awk '{ printf "\"%s\",\n", $0 }' your_file_name

需要注意的是,双引号和逗号中的文本终端打印出来的,文件本身不受影响。

于 2022-02-14T15:55:08.330 回答
-2

我使用 sed 和两个表达式来替换行首和行尾,因为在我的特定用例中,我只想在包含特定单词的行周围放置 HTML 标记。

bla所以我在文本文件中搜索了包含在变量中的单词的行,inputfile并将开头替换为<P>结尾</P>(实际上我在真实的东西中做了一些更长的 HTML 标记,但这可以作为示例)

如同:

$ bla=foo
$ sed -e "/${bla}/s#^#<P>#" -e "/${bla}/s#\$#</P>#" inputfile
<P>foo</P>
bar
$
于 2015-08-26T13:38:16.777 回答