Bunu deneyin (gawk gereklidir).
awk '{a=gensub(/.*#([0-9]+)(\").*/,"\\1","g",$0);if(a~/[0-9]+/) {gsub(/[0-9]+\"/,a+11"\"",$0);}print $0}' YourFile
Örneğinizle test edin:
kent$ echo '(bookmarks
("Chapter 1 Introduction 1" "#1"
("1.1 Problem Statement and Basic Definitions 2" "#2")
("Exercises 30" "#30")
("Notes and References 34" "#34"))
)
'|awk '{a=gensub(/.*#([0-9]+)(\").*/,"\\1","g",$0);if(a~/[0-9]+/) {gsub(/[0-9]+\"/,a+11"\"",$0);}print $0}'
(bookmarks
("Chapter 1 Introduction 12" "#12"
("1.1 Problem Statement and Basic Definitions 13" "#13")
("Exercises 41" "#41")
("Notes and References 45" "#45"))
)
İki sayı (örn. 1 "ve" # 1 ") farklıysa veya bu desenle aynı satırda daha fazla sayı varsa (örneğin 23" ... 32 "..." # bu komutun çalışmayacağını unutmayın. 123 ").
GÜNCELLEME
@Tim (OP) "
, aynı satırda izlenen sayının farklı olabileceğini söylediğinden, önceki çözümümde bazı değişiklikler yaptım ve yeni örneğiniz için çalışmasını sağladım .
BTW, örnekten bir içerik yapısı tablosu olabileceğini hissediyorum, bu yüzden iki sayının nasıl farklı olabileceğini göremiyorum. Birincisi, yazdırılan sayfa numarası, ikincisi # ile sayfa dizini olacaktır. Haklı mıyım?
Neyse, ihtiyacınızı en iyi biliyorsunuz. Şimdi yeni çözüm, hala gawk ile (okumayı kolaylaştırmak için komutu satırlara ayırıyorum):
awk 'BEGIN{FS=OFS="\" \"#"}{if(NF<2){print;next;}
a=gensub(/.* ([0-9]+)$/,"\\1","g",$1);
b=gensub(/([0-9]+)\"/,"\\1","g",$2);
gsub(/[0-9]+$/,a+11,$1);
gsub(/^[0-9]+/,b+11,$2);
print $1,$2
}' yourFile
yeni örneğinizle test edin :
kent$ echo '(bookmarks
("Chapter 1 Introduction 1" "#1"
("1.1 Problem Statement and Basic Definitions 23" "#2")
("Exercises 31" "#30")
("Notes and References 42" "#34"))
)
'|awk 'BEGIN{FS=OFS="\" \"#"}{if(NF<2){print;next;}
a=gensub(/.* ([0-9]+)$/,"\\1","g",$1);
b=gensub(/([0-9]+)\"/,"\\1","g",$2);
gsub(/[0-9]+$/,a+11,$1);
gsub(/^[0-9]+/,b+11,$2);
print $1,$2
}'
(bookmarks
("Chapter 1 Introduction 12" "#12"
("1.1 Problem Statement and Basic Definitions 34" "#13")
("Exercises 42" "#41")
("Notes and References 53" "#45"))
)
EDIT2 @Tim adlı kullanıcının yorumuna dayanmaktadır
(1) FS = OFS = "\" \ "#" hem girdi hem de çıktıdaki alan ayırıcısının çift tırnak, boşluk, çift tırnak ve # olduğu anlamına mı geliyor? Neden çift tırnak iki kez belirtilsin?
Hem giriş hem de çıkış bölümünde ayırıcı için haklısınız. Ayırıcıyı şu şekilde tanımladı:
" "#
İki çift tırnak vardır, çünkü istediğiniz iki sayıyı yakalamak daha kolaydır (örnek girişinize göre).
(2) /.* ([0-9] +) $ / 'da, $ dizenin sonu anlamına mı geliyor?
Kesinlikle!
(3) gensub () 'un üçüncü argümanında "g" ve "G" arasındaki fark nedir? G ve g arasında fark yoktur. Şuna bir bak:
gensub(regexp, replacement, how [, target]) #
Search the target string target for matches of the regular expression regexp.
If "how" is a string beginning with ‘g’ or ‘G’ (short for “global”), then
replace all matches of regexp with replacement.
Bu, http://www.gnu.org/s/gawk/manual/html_node/String-Functions.html adresinden . gensub'un detaylı kullanımını öğrenmek için okuyabilirsiniz.