Spróbuj tego (gawk jest potrzebny).
awk '{a=gensub(/.*#([0-9]+)(\").*/,"\\1","g",$0);if(a~/[0-9]+/) {gsub(/[0-9]+\"/,a+11"\"",$0);}print $0}' YourFile
Przetestuj na swoim przykładzie:
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"))
)
Zauważ, że to polecenie nie będzie działać, jeśli dwie liczby (np. 1 ”i„ # 1 ”) są różne. Lub w tym samym wierszu jest więcej liczb z tym wzorem (np. 23„ ... 32 ”...” # 123 ") w jednym wierszu.
AKTUALIZACJA
Ponieważ @Tim (OP) powiedział, że liczba, po której następuje ta "
sama linia, może być inna, wprowadziłem pewne zmiany w moim poprzednim rozwiązaniu i sprawiłem , że działało w twoim nowym przykładzie.
BTW, z przykładu uważam, że może to być tabela struktury treści, więc nie rozumiem, jak te dwie liczby mogą się różnić. Pierwszy to wydrukowany numer strony, a drugi z # to indeks strony. Czy mam rację?
W każdym razie najlepiej znasz swoje wymagania. Teraz nowe rozwiązanie, wciąż z gawk (dzielę polecenie na linie, aby ułatwić czytanie):
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
przetestuj na nowym przykładzie:
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 na podstawie komentarza @Tim
(1) Czy FS = OFS = "\" \ "#" oznacza, że separatorem pola na wejściu i wyjściu jest podwójny cudzysłów, spacja, podwójny cudzysłów i #? Po co podawać podwójną wycenę dwa razy?
Masz rację dla separatora zarówno w części wejściowej, jak i wyjściowej. Zdefiniował separator jako:
" "#
Istnieją dwa podwójne cudzysłowy, ponieważ łatwiej jest złapać dwie pożądane liczby (na podstawie przykładowego wejścia).
(2) W /.* ([0-9] +) $ /, czy $ oznacza koniec ciągu?
Dokładnie!
(3) Jaka jest różnica między „g” a „G” w trzecim argumencie gensub ()? nie ma różnicy między G i g. Sprawdź to:
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.
To jest z http://www.gnu.org/s/gawk/manual/html_node/String-Functions.html . możesz przeczytać, aby uzyskać szczegółowe informacje na temat korzystania z gensub.