これを試してください(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"))
)
このコマンドは、2つの数字(例:1 "と"#1 ")が異なる場合、またはこのパターンと同じ行にさらに数がある場合(例:23" ... 32 "..."#)は機能しないことに注意してください。 123 ")1行。
更新
@Tim(OP)は、"
同じ行に続く数字が異なる可能性があると言ったため、以前のソリューションにいくつか変更を加え、新しい例で機能するようにしました。
ところで、この例から、それは目次構造のテーブルである可能性があると思うので、2つの数字がどのように異なるのかわかりません。最初は印刷されたページ番号で、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回指定する理由
入力部と出力部の両方でセパレーターに適しています。セパレータを次のように定義しました:
" "#
(入力例に基づいて)必要な2つの数値を簡単にキャッチできるため、2つの二重引用符があります。
(2)/.*([0-9] +)$ /では、$は文字列の終わりを意味しますか?
丁度!
(3)gensub()の3番目の引数で、「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の詳細な使用法を読むことができます。