इसे आज़माएं (गौक आवश्यक है)।
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 (ओपी) ने कहा कि "
एक ही पंक्ति में उसके बाद की संख्या अलग हो सकती है, मैंने अपने पिछले समाधान पर कुछ बदलाव किए, और इसे आपके नए उदाहरण के लिए काम किया।
BTW, उदाहरण से मुझे लगता है कि यह सामग्री संरचना की एक तालिका हो सकती है, इसलिए मैं नहीं देखता कि दोनों संख्याएं कैसे भिन्न हो सकती हैं। पहले मुद्रित पृष्ठ संख्या होगी, और # पेज के साथ 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) एफएस = ओएफएस = "\" \ "#" का मतलब इनपुट और आउटपुट दोनों में क्षेत्र का विभाजक है? दो बार दोहरे उद्धरण क्यों निर्दिष्ट करें?
आप इनपुट और आउटपुट दोनों भाग में विभाजक के लिए सही हैं। इसने विभाजक को इस प्रकार परिभाषित किया:
" "#
दो दोहरे उद्धरण हैं, क्योंकि आपके द्वारा वांछित दो संख्याओं को पकड़ना आसान है (आपके उदाहरण इनपुट के आधार पर)।
(2) In.* ([0-9] +) $ /, का अर्थ है स्ट्रिंग का अंत?
बिल्कुल सही!
(३) गेंसब के तीसरे तर्क में (), "जी" और "जी" के बीच क्या अंतर है? 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 का विस्तृत उपयोग प्राप्त करने के लिए पढ़ सकते हैं।