试试这个(需要gawk)。
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的详细用法。