Regex Bash-如何将每一行放在报价单中
我想把每一行放在引号内,例如:Regex Bash-如何将每一行放在报价单中,regex,linux,bash,shell,Regex,Linux,Bash,Shell,我想把每一行放在引号内,例如: abcdefg hijklmn opqrst 转换为: "abcdefg" "hijklmn" "opqrst" 如何在Bash shell脚本中执行此操作?使用sed: sed -e 's/^\|$/"/g' file 如果文件包含空行,则需要更多的工作。使用awk awk '{ print "\""$0"\""}' inputfile 使用纯bash while read FOO; do echo -e "\"$FOO\"" done <
abcdefg
hijklmn
opqrst
转换为:
"abcdefg"
"hijklmn"
"opqrst"
如何在Bash shell脚本中执行此操作?使用sed:
sed -e 's/^\|$/"/g' file
如果文件包含空行,则需要更多的工作。使用awk
awk '{ print "\""$0"\""}' inputfile
使用纯bash
while read FOO; do
echo -e "\"$FOO\""
done < inputfile
NF
告诉awk
只有在字段数大于零(行不是空的)时才执行打印命令。我认为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
#/bin/bash
chr=“\”“
file=“file.txt”
cp$文件$文件。“\u备份”
而read-r行
做
回显“${chr}$行${chr}”
完成新文件
mv newfile$文件
此sed也适用于忽略空行:
sed -i.bak 's/^..*$/"&"/' inFile
或
(不是最漂亮的,但可能是最快的)
现在,如果输入可能包含引号,则可能需要使用反斜杠将其转义(然后也转义反斜杠),如:
我使用以下命令:
xargs -I{lin} echo \"{lin}\" < your_filename
在这两种情况下,您的IFS必须为默认值,或者至少为
'\n'
。我使用sed和两个表达式来替换行的开头和结尾,因为在我的特定用例中,我只想在包含特定单词的行周围放置HTML标记
因此,我在文本文件inputfile
中搜索了包含bla
变量中的单词的行,并用
替换了开头,用
替换了结尾(实际上,我在实际操作中做了一些更长的HTML标记,但这可以作为示例)
类似于:
$ bla=foo
$ sed -e "/${bla}/s#^#<P>#" -e "/${bla}/s#\$#</P>#" inputfile
<P>foo</P>
bar
$
$bla=foo
$sed-e/${bla}/s#^\''-e/${bla}/s\$\\\\\\\\
\\\\\\\\”输入文件
foo
酒吧
$
我尝试了这个方法,发现出于某种原因,在空行上它只输出一个引号。可以执行sed's/*/“&”/
@glennjackman:是的。如果行为空,则只有一个位置可以尝试替换。sed's/^/;s/$/“/”文件,假设没有任何行已被引用。对于读取
解决方案,您需要IFS=read-r FOO
。否则,您将丢失行开头的空格,反斜杠转义,或者丢失FOO
并使用隐式的$REPLY
名称。只需在读取时执行;执行printf'%s'\n'$REPLY即可"; 完成
我认为使用awk
的所有其他原因:D@glennjackman当然,如果您确实想保留反斜杠转义。s/行不为空/行不为空/
。请注意,-e
是不需要的,如果它包含反斜杠,实际上会改变内容。最好至少提供一些解释,说明您认为这不正确的原因。除了说明如何输出文字双引号,它根本不涉及在现有文本中添加引号的主题。@chepner我已修改了我的评论,感谢您给我反馈,以便我能更有效地作出贡献。欢迎使用堆栈溢出。请尽快阅读这篇文章。你的问题不坏,但它是含糊不清的,或者可能只是有点不完整。行从哪里来--从文件、变量数组或单个变量中的行(或其他地方)?输出需要去哪里?放入变量、数组、文件或其他地方?到目前为止,答案显示了各种可能性(并没有涵盖我提到的所有情况)。此外,很多人似乎出于错误的原因想要这样做。如果您有一个程序,它要求其参数用引号括起来,如/tool“example-sensume-one”或“example-sensume-two”
,则引号由shell使用,而不是数据本身的一部分。如果变量中有这些值,则变量不应包含引号,但需要引用插值/tool“$sentence1”“$sentence2”
还需要考虑,您可能并不真正需要回显该内容,但可能需要引号才能在脚本中执行其他操作。对我来说,我可以运行一个命令:script-that-lists-files-per-line.py | xargs-I{lin}sudo chmod a+r{lin}你说得对,马塞特先生,我的错误没有说清楚,这只是一个命令示例。在windows 10上使用mingw xargs 4.4.2从命令提示符找到>xargs-I{lin}echo“'lin”为单引号工作。我很欣赏这个解决方案,因为它只需要我在嵌入命令时转义一个单引号,我需要将每个引号转义为\\\”
。
paste -d\" /dev/null your-file /dev/null
sed 's/["\]/\\&/g; s/.*/"&"/' your-file
xargs -I{lin} echo \"{lin}\" < your_filename
xargs -i echo \"{}\" < your_filename
$ bla=foo
$ sed -e "/${bla}/s#^#<P>#" -e "/${bla}/s#\$#</P>#" inputfile
<P>foo</P>
bar
$