Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Bash-如何将每一行放在报价单中_Regex_Linux_Bash_Shell - Fatal编程技术网

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
$