この文字列があります
22<>22
このリストがあります。
test
dev
too
出力は次のようにする必要があります
22test22
22dev22
etc..
これを行うために使用するコマンドは次のとおりです。
cat list | sed 's/$/22/g' | sed 's/^/22/g'
編集する
これを行うために使用するコマンド
cat list | sed 's/$/22/' | sed 's/^/22/'
しかし、リストが多すぎて役に立ちません。
22<>22
3<>33
134423<>4
答え1
置換する文字列のリストを配列に割り当てることができます<>
。というファイルには以下がlist.txt
必要です。
test
dev
too
というファイルには以下がdata.txt
必要です。
22<>22
3<>33
134423<>4
解決策1:
ファイルを読み取り、list.txt
その内容を配列に割り当てます。
Bashを使用して配列を読み取る
export IFS=$'\n'
readarray array < list.txt
zshを使用して配列を読み取る
array=("${(@f)"$(<list.txt)"}")
最後に、変数を繰り返してarray
リストの各要素を取得し、次に置き換える必要がありますsed
。
for i in ${array[@]}; do
sed "s/<>/$i/g" data.txt
done
メモ:for ループは、端末の標準出力としてテキストを印刷します。ただし、出力をファイルにリダイレクトするには、>
afterdone
キーワードを使用できます。
for i in ${array[@]}; do
sed "s/<>/$i/g" data.txt
done > final.txt
このソリューションは、次の出力を生成します。
22test22
3test33
134423test4
22dev22
3dev33
134423dev4
22too22
3too33
134423too4
解決策2:
まず、ファイルを読み取り、list.txt
その内容を配列に割り当てる必要があります。
Bashを使用して配列を読み取る
export IFS=$'\n'
readarray array < list.txt
zshを使用して配列を読み取る
array=("${(@f)"$(<list.txt)"}")
その後、ファイル内の各行を繰り返す必要があり、data.txt
そのループ内で配列内の各項目を読み取ってsed
コマンドを適用する必要があります。
while read line ; do
for i in ${array[@]}; do
sed "s/<>/$i/g" <<< "$line"
done
done < data.txt
または、標準出力をファイルにリダイレクトします。
while read line ; do
for i in ${array[@]}; do
sed "s/<>/$i/g" <<< "$line"
done
done < data.txt > final.txt
このソリューションは、次の出力を生成します。
22test22
22dev22
22too22
3test33
3dev33
3too33
134423test4
134423dev4
134423too4
答え2
<>
文字区切り記号に変更|
:
$ sed -s 's/<>/|/g' asdf1 > asdf2
$ cat asdf2
22|22
3|33
134423|4
同じ単一文字区切り文字を使用して、|
2つのファイルを1つにマージします。
$ paste -d"|" asdf asdf2 > combined
$ cat combined
test|22|22
dev|3|33
too|134423|4
に分割|
して順番に印刷します。
$ awk -F'|' '{print $2 $1 $3}' combined
22test22
3dev33
134423too4
要約すると、次のようになります。
sed -s 's/<>/|/g' asdf1 > asdf2
paste -d"|" asdf asdf2 > combined
awk -F'|' '{print $3 $1 $2}' combined
<>
ただし、これは各行にプレースホルダーが1つしかない場合にのみ機能します。
答え3
の場合、または文字がすべて含まれていないとzsh
仮定します。list
$
`
\
$ cat list
22<>22
3<>33
134423<>4
$ cat data
test
dev
too
$ () {print -rC1 -- ${(e)${(f)"$(<list)"}//'<>'/'$^@'}; } ${(f)"$(<data)"}
22test22
22dev22
22too22
3test33
3dev33
3too33
134423test4
134423dev4
134423too4
空でない行をdata
匿名関数にパラメータとして渡します。その関数では、行を置き換えて<>
xpand引数拡張フラグを使用して(引数リスト)などの拡張を実行します。ただし、配列はcsh-の代わりに/-likeに展開されます。 (withの代わりにwithに拡張)。$^@
list
22$^@22
3$^@33
e
$^@
$@
rc
fish
a=(1 2 3)
before${^a}after
before1after
before2after
before3after
before1
2
3after
before${a}after