Попробуй это (ткнуть нужно).
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) сказал, что число, за которым следует одна и та "
же строка, может отличаться, я внес некоторые изменения в свое предыдущее решение и заставил его работать для вашего нового примера.
Кстати, из примера я чувствую, что это может быть таблица структуры контента, поэтому я не вижу, как эти два числа могут различаться. Сначала будет напечатан номер страницы, а 2 с # будет индекс страницы. Я прав?
Во всяком случае, вы знаете свое требование лучше всего. Теперь новое решение, все еще с 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.