入力行を引用するフィルタコマンドがあるかどうか疑問に思います。
したがって、配管するとき:
line number 1
line number 2
line number 3
それについてあなたは以下を得ます:
"line number 1"
"line number 2"
"line number 3"
3つではなく1つのパラメータで処理さ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
そしてマニュアルで推奨されている)出力プログラムは、改行\0
文字の代わりにNUL()で項目を区切り、その--null
オプションを代わりに使用することです--delimiter
。ただし、入力文字列自体に改行文字が含まれていない限り、上記の方法に従います。大丈夫でしょう。
答え4
GNUシステムでのシェルのサポート$'...'
:
xargs -d$'\n' printf '%s\n' <<\IN
line number 1
line number 2
line number 3
IN
標準ツールを使用してください。
:|paste -d'"' - file - | xargs printf '%s\n'
どちらも行に含まれる引用符がないとします。