一連の文字列を出力するコマンドがあるとします。このコマンドの出力は次のようになります。
...
foo
bar
blargh
...
私はいくつかのセット文字列を持っていると言います
myString$Blah
$がコマンドの出力にある各文字列を挿入して、次のようなファイルになるようにします。
...
myStringfooBlah
myStringbarBlah
myStringblarghBlah
...
これを達成する最も簡単な方法は何ですか? (Awkとsedが望ましい)
sed
やawk
も必要ありません。
xargs
はこれを行うことができます:with:-L1 -I '$' echo 'myString$Blah'
$ cat x.list
foo
bar
blargh
$ cat x.list | tr '\n' '\0' | xargs -0 -L1 -I '$' echo 'myString$Blah'
myStringfooBlah
myStringbarBlah
myStringblarghBlah
これは、シェル(少なくともbash
)で、それほど問題なく完全に実行できます。これを行うスクリプトは次のとおりです。
#!/bin/bash
pattern="$1"
input_file="$2"
output_file="$3"
saved_IFS="$IFS"
IFS=$'\n'
# Store each line of the input file into an array named 'lines'.
lines=($(< $input_file))
IFS="$saved_IFS"
# Truncate output file, if any.
cat /dev/null > $output_file
# Substitute each line into the pattern, and write to output file.
for ln in "${lines[@]}"
do
echo ${pattern/$/$ln} >> $output_file
done
このスクリプトがscript
と呼ばれ、1行に1つの文字列を持つin.txt
というファイルがあるとすると、script in.txt out.txt
を実行すると、out.txt
に目的の出力が得られます。
ドル記号の代わりにアンパサンドを使用してフォーマット文字列myString&Blah
を使用できると仮定して、出力を次のようにパイプします。
sed "s/.*/$format/"
これは、&
が置換文字列の「ここに一致を挿入」演算子として使用されるために機能します。正規表現は行全体と一致するため、行全体が&
に挿入されます。
フォーマット文字列を拡張できるようにするには、二重引用符を使用することが重要です。
本当にアンパサンドを使用する必要がある場合は、次を使用してください。
sed "s/.*/$(echo "$format" | tr '$' '&')/"
文字列に空白がある場合は、$ formatを囲む引用符が重要です。