এটি চেষ্টা করুন (গোক প্রয়োজন)
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 ") এক লাইনে।
হালনাগাদ
যেহেতু @ টিম (ওপি) বলেছেন যে "
একই লাইনে অনুসরণ করা সংখ্যাটি ভিন্ন হতে পারে, তাই আমি আমার আগের সমাধানটিতে কিছু পরিবর্তন করেছি এবং এটি আপনার নতুন উদাহরণের জন্য কার্যকর করে তুলেছি।
বিটিডাব্লু, উদাহরণ থেকে আমি অনুভব করি যে এটি সামগ্রীর কাঠামোর একটি টেবিল হতে পারে, সুতরাং দুটি সংখ্যা কীভাবে আলাদা হতে পারে তা আমি দেখছি না। প্রথমটি হবে মুদ্রিত পৃষ্ঠা নম্বর, এবং দ্বিতীয় # এর সাথে পৃষ্ঠা সূচক হবে। আমি কি সঠিক?
যাইহোক, আপনি আপনার প্রয়োজনীয়তা ভাল জানেন। এখন নতুন সমাধান, এখনও গাওয়াকের সাথে (এটি পড়তে সহজ করার জন্য আমি কমান্ডটি লাইনগুলিতে বিভক্ত করছি):
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 @ টিমের মন্তব্যের ভিত্তিতে
(1) এফএস = অফস = "\" # "#" এর অর্থ কি ইনপুট এবং আউটপুট উভয় ক্ষেত্রে ক্ষেত্রের বিভাজক দ্বিগুণ উদ্ধৃতি, স্থান, ডাবল উদ্ধৃতি এবং #? দুবার ডাবল উদ্ধৃতি কেন নির্দিষ্ট করবেন?
আপনি ইনপুট এবং আউটপুট উভয় অংশে বিভাজকের পক্ষে ঠিক। এটি পৃথককে সংজ্ঞায়িত করেছে:
" "#
দুটি ডাবল উদ্ধৃতি রয়েছে, কারণ আপনি যে দুটি সংখ্যা চান তা ধরা সহজ (আপনার উদাহরণের ইনপুটের উপর ভিত্তি করে)।
(২) ইন /.* ([০-৯] +) $ /, $ মানে স্ট্রিংটির সমাপ্তি?
একদম ঠিক!
(৩) জিনসুব () এর তৃতীয় যুক্তিতে "জি" এবং "জি" এর মধ্যে পার্থক্য কী? জি এবং জি মধ্যে কোন পার্থক্য নেই। এটা দেখ:
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-Function.html থেকে । আপনি জেনসাবের বিশদ ব্যবহার পেতে পড়তে পারেন।