Bisakah sed mengganti teks dengan string yang diformat seperti pencetakan berformat printf?
Perintah sed berikut menggantikan baris yang dimulai dengan nilai "$domain" saat ini dengan beberapa nilai yang ditentukan dalam variabel.
/bin/sed "s/\(^${domain} *${limittype} * ${limititem}.*\)/$EXPL#\1\n${domain} ${limittype} ${limititem} ${value}/" /etc/security/limits.conf
Namun output tidak akan disejajarkan dengan benar karena panjang nilai domain dll. tidak sama.
Jadi hasilnya akan seperti
#oracle hard nproc 131072
oracle hard nproc 666
Meskipun valid, sulit untuk dibaca. Saya lebih suka mendapatkan sesuatu seperti
#oracle hard nproc 131072
oracle hard nproc 666
Yang terbaik yang bisa saya lakukan untuk mendapatkan hasil yang diinginkan adalah:
/bin/sed "s/\(^${domain}\)\( *\)\(${limittype}\)\( *\)\(${limititem}\)\( *\)\(.*\)/$EXPL#\1\2\3\4\5\6\7\n${domain}\2${limittype}\4${limititem}\6${value}/" /etc/security/limits.conf
Tapi saya yakin pasti ada cara yang lebih elegan untuk melakukan ini.
Dokumen sed one liners berisi beberapa contoh yang menggunakan sejumlah karakter tertentu, mis.
sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # set at 78 plus 1 space
Tapi ini ada di regexp
bagian tidak dalam replacement
bagian.
Jawaban yang Diterima:
Ini menggunakan sintaks regex yang diperluas -r
, yang membersihkan banyak kekacauan. Selain itu, karena Anda sudah mengetahui beberapa nilai bidang, Anda sebenarnya tidak perlu mereferensikan kembali nilai tersebut, sekali lagi mengurangi kekacauan (dan overhead).
&
adalah nilai pengganti khusus:itu menampung seluruh pola yang cocok. Menggunakan &
, sekali lagi mengurangi kekacauan. Karena ini bukan referensi balik, biaya overhead jauh lebih sedikit.
Saya telah menggunakan ( +)
vs. ( *)
. +
mengasumsikan bahwa setidaknya ada satu ruang antara bidang input. Ubah saja menjadi *
bukan itu masalahnya.
EXPL=
dom=oracle
typ=hard
itm=nproc
val=666
echo "oracle hard nproc 131072" |
sed -r "s/^$dom( +)$typ( +)$itm( +).*/$EXPL#&\n$dom\1$typ\2$itm\3$val/"
keluaran
#oracle hard nproc 131072
oracle hard nproc 666