이것을 시도하십시오 (개크가 필요합니다).
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)은 "
같은 줄에 나오는 숫자 가 다를 수 있다고 말했기 때문에 이전 솔루션에서 일부 변경을 수행하여 새 예제에서 작동하게했습니다.
BTW, 예에서 나는 그것이 컨텐츠 구조의 테이블 일 수 있다고 생각하므로 두 숫자가 어떻게 다른지 알 수 없습니다. 첫 번째는 인쇄 된 페이지 번호이고, 두 번째는 페이지 색인입니다. 내가 맞아?
어쨌든, 당신은 당신의 요구 사항을 가장 잘 압니다. 이제 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"))
)
@Tim 의 의견에 따른 EDIT2
(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의 자세한 사용법을 읽으려면 읽을 수 있습니다.