我想知道是否有一个过滤命令来引用输入行。
所以在配管时:
line number 1
line number 2
line number 3
到它,你得到:
"line number 1"
"line number 2"
"line number 3"
我需要这个命令来通过管道传输一行流,以xargs
确保将其xargs
视为line number 1
一个参数而不是三个参数。我确信它还有许多其他用途。
有这样的命令吗?这叫什么?
答案1
没有专门为此设计的工具,但许多多功能工具都可以做到这一点:
sed 's/^/"/;s/$/"/'
perl -pe 's/^/"/;s/$/"/'
或者perl -lne 'print "\"$_\""'
awk '{printf "\"%s\"\n",$0}'
while read -r line; do printf '"%s"\n' "$line"; done
(所有这些都假设该行不包含双引号。如果包含,它将中断xargs
)
答案2
我会提供 Perl 的quotemeta
功能。不是相当你问什么,因为它转义空格而不是用引号替换它们。
但作为一项附带福利,它还可以处理其他特殊字符(如*
):
perl -nle 'print quotemeta'
(或者如评论中所述,较短的形式perl -ple '$_=quotemeta'
:)
它会把你的台词变成:
line\ number\ 1
line\ number\ 2
line\ number\ 3
应该有相同的结果 - 以及处理:
Line number \"`rm -rf *`\"
还有类似的恶作剧:)
答案3
如果在 GNU 系统上,请查看--delimiter
的参数xargs
。由于您的输入由换行符分隔,因此您根本不需要依赖引用,或使用任何其他工具:
cat files.txt | xargs --delimiter=\\n printf "<%s>"
其中files.txt
包含您的输入:
line number 1
line number 2
line number 3
给出输出:
<line number 1><line number 2><line number 3>
注意:您不需要将输入存储在文件中并使用cat
;您当然可以直接从另一个程序进行管道传输。我cat
在示例中使用了它,因为它在创建这样的独立示例时非常普遍且实用。
更好的(xargs
手册推荐的)是让您的输出程序用 NUL ( \0
) 而不是换行符分隔条目,并使用该--null
选项而不是--delimiter
,但只要您的输入字符串本身永远不会包含换行符,您就可以按照上面的方法就OK了。
答案4
在 GNU 系统上,具有 shell 支持$'...'
:
xargs -d$'\n' printf '%s\n' <<\IN
line number 1
line number 2
line number 3
IN
使用标准工具:
:|paste -d'"' - file - | xargs printf '%s\n'
这两者都假设您的行不包含嵌入的引号。