質問

私は「insert.txt」という名前のファイルを持っています。それは、この(または醜い)のように見えることができます:

ASDFG?|??|?\/\HJKL<MNBVCXZQWERTYUIOP
zxvbnmlkjhgfdsaqwertyuiop
123"'`~4567890987654321!@#$%^&*()
@#$%^&*()+_}{":?>

そして、私は「STOPSTACKOVERFLOW」に「STARTSTACKOVERFLOW」で区切られたターゲットファイル(target.txt)にテキストのブロックを交換したいです。 (私は少しここで問題を簡素化していますが、それは同じです)。

私はこれを行うために使用するbashスクリプトがあります:

TARGETFILE=target.txt
SOURCEFILE=insert.txt
SOURCETXT="$(<$SOURCEFILE)"
DELIMTXT=$(printf "%q" "$SOURCETXT")

sed -i -e "/STARTSTACKOVERFLOW/,/STOPSTACKOVERFLOW/cSTARTSTACKOVERFLOW\n\n${DELIMTXT}\n\nSTOPSTACKOVERFLOW\n" $TARGETFILE

問題は、どのような「target.txt」に貼り付けているが、実際にANSI-Cが引用されているということです

$'ASDFG?|??|?\/\HJKL<MNBVCXZQWERTYUIOP
zxvbnmlkjhgfdsaqwertyuiop
123"'`~4567890987654321!@#$%^&*()
@#$%^&*()+_}{":?>'

$ '' を追加します。

理由はprintfの「%qが」この引用スタイルを生産していることです。私は、このファイル内のすべての悪をエスケープする必要がありますので、しかし必要性、それを

- 私はそれを避けるためにしたいと思います。 bashのを使用して、上記のことが良い方法ですと、sedの?

役に立ちましたか?

解決

POSIXは、ファイルから読み込むためには「r」コマンドを持っているのsed。だから、ます:

sed -i -e '/STARTSTACKOVERFLOW/,/STOPSTACKOVERFLOW/r large.txt' target.txt

は唯一の問題は、ファイルが一度読み取られているかどうかである、または開始と停止線の間のラインに一回。私はそれが行ごとに一度読まれている疑いがある...と離れて余分な行をスローする方法を取り組んで難しいです...多分ます:

sed -i -e '/STOPSTACKOVERFLOW/r large.txt' \
       -e '/STARTSTACKOVERFLOW/,/STOPSTACKOVERFLOW/d' target.txt

簡単なデモ

このバージョンでは、開始と終了マーカーを削除します。

$ cat data
sdasas
adsasdas
start
more
more
end
sdasda
sdasdad
$ cat replace
replace1
replace2
replace3
$ sed -e '/^end$/r replace' -e '/start/,/end/d' data
sdasas
adsasdas
replace1
replace2
replace3
sdasda
sdasdad

開始と終了マーカーを保存

$ cat sedfile
/^end$/{
a\
start
r replace
a\
end
}
/^start$/,/^end$/d
$ sed -f sedfile data
sdasas
adsasdas
start
replace1
replace2
replace3
end
sdasda
sdasdad
$ 

これはfiddlierある - 私は、スクリプトのファイルを使用せずにそれをやろうではないだろうが、あなたがしたい場合、あなたはそうすることができます。これは、しかし、ワンライナーではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top