Sed: garis pencocokan ekspresi reguler tanpa ‹!--

Saya memiliki perintah sed untuk mengomentari perintah xml

sed 's/^\([ \t]*\)\(.*[0-9a-zA-Z<].*\)$/\1<!-- Security: \2 -->/' web.xml 

Dibutuhkan:

<a>

  <!-- Comment -->
  <b>
    bla
  </b>

</a>

Menghasilkan:

<!-- Security: <a> -->

  <!-- Security: <!-- Comment --> -->    // NOTE: there are two end comments.  
  <!-- Security: <b> -->
    <!-- Security: bla -->
  <!-- Security: </b> -->

<!-- Security: </a> -->

Idealnya saya tidak ingin menggunakan skrip sed saya untuk mengomentari hal-hal yang sudah dikomentari.

Ie:

<!-- Security: <a> -->

  <!-- Comment -->
  <!-- Security: <b> -->
    <!-- Security: bla -->
  <!-- Security: </b> -->

<!-- Security: </a> -->

Saya bisa melakukan sesuatu seperti ini:

sed 's/^\([ \t]*\)\(.*[0-9a-zA-Z<].*\)$/\1<!-- Security: \2 -->/' web.xml
sed 's/^[ \t]*<!-- Security: \(<!--.*-->\) -->/\1/' web.xml

tapi menurutku one liner lebih bersih (?)

Ini sangat mirip: mencocokkan baris yang tidak tidak berisi teks tertentu dengan ekspresi reguler


person sixtyfootersdude    schedule 05.04.2010    source sumber


Jawaban (3)


Ini sepertinya berhasil.

^([ \t]*)(?!<!--)([0-9a-zA-Z<].*)$

Anda harus keluar dari tanda kurung dan hal-hal lain agar benar-benar dapat berfungsi dengan sed.

Menguji ekspresi dalam penguji ekspresi reguler online.

Sayangnya sepertinya sed tidak mendukung lookahead (tetapi ssed mendukung).
mungkin Anda harus mencoba awk atau ssed.

person João Portela    schedule 05.04.2010
comment
Ya, saya sudah mencobanya (dan variasi yang berbeda) tetapi saya tidak berhasil. Itu akhirnya tidak menyoroti apa pun. - person sixtyfootersdude; 05.04.2010
comment
Setelah membaca lebih lanjut sepertinya sed tidak mendukung ekspresi tersebut. Anda harus menggunakan mode ssed dan perl aktif (-R). menemukan info itu di sini: sed.sourceforge.net/sedfaq6.html - person João Portela; 06.04.2010
comment
Keren. Itu juga yang saya pikirkan. +1 untuk klarifikasi - person sixtyfootersdude; 06.04.2010

Anda dapat menggunakan awk, Jika kebutuhan Anda benar:

awk -F"," '!/<!--/&&NF{$0="<!-- Security: "$0"-->"}1' file
person ghostdog74    schedule 06.04.2010
comment
hmmm, lebih suka menggunakan sed tetapi +1 untuk saran. - person sixtyfootersdude; 07.04.2010

Akhirnya terjadi dengan ini:

startInsert="<!-- Security: "
endInsert=" -->"

whiteSpace="[ \t]*"
char="[0-9a-zA-Z^_)!-/:-@[-\{-~]"

sed "s/^\($whiteSpace\)\(.*$char.*\)$/\1$startInsert\2$endInsert/" $file 
sed "s/^\($whiteSpace\)$startInsert\(<!--.*\-->\)$endInsert/\1\2/" $file 

Tidak seanggun yang saya harapkan tetapi bekerja dengan sangat baik.

person sixtyfootersdude    schedule 07.04.2010