GNU/Linux >> Belajar Linux >  >> Linux

Lum – Bagaimana Agar Output Sed Diformat Seperti Pencetakan Terformat Printf?

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

Linux
  1. tcpdump:bagaimana cara mendapatkan keluaran grepable?

  2. Bagaimana mengurutkan keluaran ini 1,10,11..2

  3. Bagaimana saya bisa mengurutkan output du -h berdasarkan ukuran

  1. Bagaimana Cara Mengganti String Dalam File?

  2. Cara grep keluaran ps dengan header

  3. Bagaimana cara menghentikan keluaran ping?

  1. Bagaimana Mengurutkan Du Output Berdasarkan Ukuran?

  2. Bagaimana Cara Menghapus Beberapa Baris Acak Dari File Teks Menggunakan Sed?

  3. Bagaimana Cara Mengingat Cara Menggunakan Redirection?