sed は中間文字列を置き換えます。

sed は中間文字列を置き換えます。

この文字列があります

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に拡張)。$^@list22$^@22 3$^@33e$^@$@rcfisha=(1 2 3)before${^a}afterbefore1after before2after before3afterbefore1 2 3afterbefore${a}after

関連情報