Solusi dengan sed saja
sed, sendiri, mampu menghasilkan baris yang tidak dimodifikasi dan yang dimodifikasi:
$ echo "redis::staging::key" | sed 's/^/RENAME /; p; s/staging/development/g'
RENAME redis::staging::key
RENAME redis::development::key
Di atas, sed pertama menambahkan string RENAME ke awal baris. Kemudian, p
perintah memberitahu sed untuk mencetak baris seperti yang ada pada saat itu (dengan "pementasan" masih di dalamnya). Substitusi berikutnya dimasukkan ke dalam "pengembangan" dan kemudian versi itu juga dicetak.
Pembaruan: Misalkan kita ingin output pada satu baris:
$ echo "redis::staging::key" | sed 's/.*/RENAME & &/; s/staging/development/2'
RENAME redis::staging::key redis::development::key
s
pertama perintah di atas menambahkan RENAME ke awal dan kemudian menggandakan baris. Yang kedua menggantikan kemunculan kedua dari pementasan dengan pengembangan.
Mengapa versi xargs tidak melakukan penggantian?
xargs -I {} echo "RENAME {} $(echo {} | sed 's/staging/development/g')"
Sebelum xargs dieksekusi, bash memproses string. Secara khusus, ia melihat $(echo {} | sed 's/staging/development/g')
dan menjalankannya ("substitusi perintah") dan mendapatkan hasil {}
. Jadi, ketika xargs akhirnya dijalankan, ia melihat perintah:
xargs -I {} echo "RENAME {} {}"
Akibatnya, s/staging/development/g
penggantian tidak pernah dilakukan.
Membuat xargs dan shell bekerja sama dalam urutan yang benar
Ada perbaikan untuk ini:
$ echo "redis::staging::key" | xargs -I {} sh -c 'echo RENAME {} $(echo {} | sed 's/staging/development/g')'
RENAME redis::staging::key redis::development::key
Di atas menempatkan perintah bash dalam tanda kutip tunggal dan meneruskannya sebagai argumen ke sh
. Dengan cara ini, string tidak diproses oleh shell sampai xargs melakukan substitusi.