入力行を引用するUnixコマンドはありますか?

入力行を引用するUnixコマンドはありますか?

入力行を引用するフィルタコマンドがあるかどうか疑問に思います。

したがって、配管するとき:

line number 1
line number 2
line number 3

それについてあなたは以下を得ます:

"line number 1"
"line number 2"
"line number 3"

3つではなく1つのパラメータで処理さxargsれるようにラインストリームをパイプするには、このコマンドが必要です。私はそれが他の用途に多く使用されていると確信しています。xargsline 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'

どちらも行に含まれる引用符がないとします。

関連情報