是否有 Unix 命令来引用输入行?

是否有 Unix 命令来引用输入行?

我想知道是否有一个过滤命令来引用输入行。

所以在配管时:

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'

这两者都假设您的行不包含嵌入的引号。

相关内容