Saya punya dua file berbeda:
File1
/home/user1/
/home/user2/bin
/home/user1/a/b/c
File2
<TEXT1>
<TEXT2>
Saya ingin mengganti <TEXT1>
dari File2 dengan isi File1 menggunakan sed
. Saya mencoba perintah ini, tetapi tidak mendapatkan output yang tepat:
cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g"
Anda dapat menggunakan alat lain juga untuk menyelesaikan masalah ini.
sed
implementasi mana yang Anda gunakan. Kode Anda berfungsi untuk saya dengan GNUsed
./home/user1/ n/home/user2/bin n/home/user1/a/b/cn <TEXT2>
. Tidak mendapat baris baru.diff
danpatch
alat memungkinkan untuk mengganti beberapa baris dalam file dengan baris lain dengan cukup mudah.$()
skrip sed membuat mata saya berdarah. Jangan pernah menggunakan data eksternal di tempat-tempat di mana beberapa karakter ditafsirkan dengan makna khusus.Jawaban:
Inilah solusi skrip sed (lebih mudah dilihat daripada mencoba membuatnya menjadi satu baris pada baris perintah):
Menjalankannya:
sumber
sed '/<TEXT1>/{rFile1^Md^M}' File2
mana "^ M" Anda menekan kembali. Masalahnya adalah sed benar-benar membutuhkan baris baru di dalam {...} untuk membatasi perintah r dan d.sed $'/<TEXT1>/ {r File1\n d}'
sed -e '/<TEXT1>/{r File1' -e 'd}' File2
<TEXT1>
, saya hanya ingin mengganti string itu sendiri, meninggalkan sisa garis utuh?Text1: <TEXT1>
untukText1: <file_contents>
.Butuh waktu lama untuk menemukan solusi ini menggunakan penggantian var. Semua solusi sed tidak bekerja untuk saya, karena mereka menghapus baris lengkap atau mengganti secara tidak benar.
Mengganti semua kejadian TEXT1 dalam file2 terhadap konten file1. Semua teks lainnya tetap tidak tersentuh.
sumber
sed
terlalu, karena "ekspansi" (alias penggantian) dibangun ke dalam shell (bash
setidaknya)Saya menjawab karena metode
diff
/patch
mungkin menarik dalam beberapa kasus. Untuk menentukan substitusi baris yang terkandung dalam fileblob1
dengan baris yang terkandung dalamblob2
penggunaan:Misalnya, jika
blob1
mengandung:dan
blob2
mengandung:yang dihasilkan
patch-file
adalah:Sekarang, Anda dapat menerapkan tambalan ini ke file lain:
Ini akan menggantikan
hello
,you
garis denganbe
,welcome
,here
baris dalamsomefile
.sumber