web-dev-qa-db-ja.com

xargsから別の文字列に文字列を挿入する

一連の文字列を出力するコマンドがあるとします。このコマンドの出力は次のようになります。

...
foo
bar
blargh
...

私はいくつかのセット文字列を持っていると言います

myString$Blah

$がコマンドの出力にある各文字列を挿入して、次のようなファイルになるようにします。

...
myStringfooBlah
myStringbarBlah
myStringblarghBlah
...

これを達成する最も簡単な方法は何ですか? (Awkとsedが望ましい)

5
well actually

sedawkも必要ありません。

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
9
Dan D.

これは、シェル(少なくとも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に目的の出力が得られます。

1
jjlin

ドル記号の代わりにアンパサンドを使用してフォーマット文字列myString&Blahを使用できると仮定して、出力を次のようにパイプします。

sed "s/.*/$format/"

これは、&が置換文字列の「ここに一致を挿入」演算子として使用されるために機能します。正規表現は行全体と一致するため、行全体が&に挿入されます。

フォーマット文字列を拡張できるようにするには、二重引用符を使用することが重要です。

本当にアンパサンドを使用する必要がある場合は、次を使用してください。

sed "s/.*/$(echo "$format" | tr '$' '&')/"

文字列に空白がある場合は、$ formatを囲む引用符が重要です。

1
jakesandlund