我想将每一行放在引号内,例如:
abcdefg
hijklmn
opqrst
转换成:
"abcdefg"
"hijklmn"
"opqrst"
如何在 Bash shell 脚本中执行此操作?
使用awk
awk '{ print "\""$0"\""}' inputfile
使用纯 bash
while read FOO; do
echo -e "\"$FOO\""
done < inputfile
whereinputfile
将是一个包含不带引号的行的文件。
如果您的文件有空行,awk绝对是要走的路:
awk 'NF { print "\""$0"\""}' inputfile
NF
告诉awk
仅当字段数大于零(行不为空)时才执行打印命令。
我使用以下命令:
xargs -I{lin} echo \"{lin}\" < your_filename
获取标准输入(从您的xargs
文件重定向)并一次将一行传递给{lin}
占位符,然后在下一个执行命令,在这种情况下是echo
带有转义的双引号。
您可以使用-i
xargs 的选项来省略占位符的名称,如下所示:
xargs -i echo \"{}\" < your_filename
在这两种情况下,您的 IFS 必须为默认值或'\n'
至少为默认值。
使用 sed:
sed -e 's/^\|$/"/g' file
如果文件包含空行,则需要更多的努力。
这个 sed 也应该适用于忽略空行:
sed -i.bak 's/^..*$/"&"/' inFile
或者
sed 's/^.\{1,\}$/"&"/' inFile
我认为 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
paste -d\" /dev/null your-file /dev/null
(不是最好看的,但可能是最快的)
现在,如果输入可能包含引号,您可能需要用反斜杠转义它们(然后也转义反斜杠),例如:
sed 's/["\]/\\&/g; s/.*/"&"/' your-file
这个答案对我有用mac terminal
。
$ awk '{ printf "\"%s\",\n", $0 }' your_file_name
需要注意的是,双引号和逗号中的文本是在终端打印出来的,文件本身不受影响。
我使用 sed 和两个表达式来替换行首和行尾,因为在我的特定用例中,我只想在包含特定单词的行周围放置 HTML 标记。
bla
所以我在文本文件中搜索了包含在变量中的单词的行,inputfile
并将开头替换为<P>
结尾</P>
(实际上我在真实的东西中做了一些更长的 HTML 标记,但这可以作为示例)
如同:
$ bla=foo
$ sed -e "/${bla}/s#^#<P>#" -e "/${bla}/s#\$#</P>#" inputfile
<P>foo</P>
bar
$