Спробуйте це (потрібен гаук).
awk '{a=gensub(/.*#([0-9]+)(\").*/,"\\1","g",$0);if(a~/[0-9]+/) {gsub(/[0-9]+\"/,a+11"\"",$0);}print $0}' YourFile
Перевірте свій приклад:
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"))
)
Зауважте, що ця команда не буде працювати, якщо два числа (наприклад, 1 "та" # 1 ") різні. Якщо в цьому рядку є більше чисел із цим шаблоном (наприклад, 23" ... 32 "..." # 123 ") в одному рядку.
ОНОВЛЕННЯ
Оскільки @Tim (OP) сказав, що число, за яким йде "
той самий рядок, може бути різним, я вніс деякі зміни в своєму попередньому рішенні і змусив його працювати на вашому новому прикладі.
До речі, з прикладу я вважаю, що це може бути таблиця структури вмісту, тому я не бачу, як два числа можуть бути різними. По-перше, буде надрукований номер сторінки, а другий з # - індекс сторінки. Я правий?
У будь-якому випадку, ви найкраще знаєте свою вимогу. Тепер нове рішення, все ще з gawk (я розбиваю команду на рядки, щоб полегшити читання):
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
перевірити своїм новим прикладом:
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
(1) Чи означає FS = OFS = "\" \ "#" роздільник поля як на вході, так і на виході - подвійна цитата, пробіл, подвійна цитата та #? Навіщо вказувати подвійну цитату двічі?
Ви маєте право на роздільник як вхідної, так і вихідної частини. Він визначив роздільник як:
" "#
Є дві подвійні лапки, тому що легше спіймати два потрібні числа (виходячи з вашого прикладу).
(2) В /.* ([0-9] +) $ /, чи означає $ кінець рядка?
Саме так!
(3) У третьому аргументі gensub (), яка різниця між "g" та "G"? різниці між G і g немає. Заціни:
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.
Це з http://www.gnu.org/s/gawk/manual/html_node/String-Functions.html . ви можете прочитати, щоб отримати детальне використання gensub.