각 행에서 하나의 숫자를 추출하고 여기에 다른 숫자를 추가합니다.

각 행에서 하나의 숫자를 추출하고 여기에 다른 숫자를 추가합니다.

내용이 다음과 같은 파일이 있습니다.

(bookmarks
 ("Cover"
  "#01.djvu" )
 ("Title page"
  "#all_24223_to_00243.cpc0002.djvu" )
 ("Preface"
  "#all_24223_to_00243.cpc0004.djvu" )
 ...

내용을 다음으로 변경하고 싶습니다.

(bookmarks
 ("Cover"
  "#2" )
 ("Title page"
  "#3" )
 ("Preface"
  "#5" )
...

이전 숫자를 유지하고 .djvu앞에 오는 0을 제거한 후 1을 더합니다. 이 작업을 수행하기 위해 awk를 어떻게 사용하는지 궁금합니다.

감사해요.

답변1

이것은 직업에 더 가깝습니다 perl.

perl -pe 's/"#\K.*?(\d+)\.djvu(?=")/$1+1/ge' <file

변수 포함:

INCR=1 perl -pe 's/"#\K.*?(\d+)\.djvu(?=")/$1+$ENV{INCR}/ge' <file

또는:

perl -spe 's/"#\K.*?(\d+)\.djvu(?=")/$1+$incr/ge' -- -incr=1 <file

답변2

GNU awk솔루션은 다음과 같습니다.

awk  '/^ *\(/{print}!/^ *\(/{split($1,aa,"[0-9]+",bb);printf "\"#%s\" )\n", bb[length(bb)]+1}'

또는 동일하지만 가독성을 위해 여러 줄에 걸쳐 표시됩니다.

awk  '/^ *\(/ { print }
     !/^ *\(/ { split( $1, aa, "[0-9]+", bb )
                printf "\"#%s\" )\n", bb[length(bb)]+1 }'
  1. /^ *\!/^ *\(/선택적 공백과 여는 대괄호로 시작하는 줄과 공백과 여는 대괄호를 포함하지 않는 줄을 포함하는 두 가지 주소 규칙입니다 .

  2. split( $1, aa, "[0-9]+", bb )그렇지 않은 행의 경우 두 개의 배열로 분할합니다. 정규식과 일치하는 구분 기호 aa인 정규식 "[0-9]+"로 줄 내용을 구분합니다 . bb마지막 요소 bb에 관심이 있습니다.

  3. printf "\"#%s\" )\n"출력 라인을 포맷하고 단일 변수를 기다립니다...

  4. bb[length(bb)]+1bb의 마지막 요소 값에 1을 더합니다.

답변3

gawk '{
    sub(/#.*\.djvu/, "#" $1 + 1 ".djvu")
    print
}' FPAT='[0-9]+\.djvu' input.txt

아이디어는 다음과 같습니다.

  • 사용 .djvu모드( ​.djvu[0-9]+\.djvuFPAT: 원본 파일명은 이고 #all_24223_to_00243.cpc0002.djvu, 추출된 부분은 입니다 0002.djvu.
  • 이전 djvu파일 이름을 #.*\.djvu추출된 파일 이름으로 바꾸고 1이전 파일 이름을 늘립니다.: 전체 행을 가져와서 $0다음 #all_24223_to_00243.cpc0002.djvu으로 바꿉니다 ( 에서 문자열을 숫자로 변환하는 방식으로 인해 0002.djvu + 1이 표현식은 순수한 숫자가 됩니다 ). 로고와 확장자를 추가합니다 .3gawk#.djvu결과: #3.djvu.

djvu이 솔루션은 예제 입력에 표시된 것처럼 파일 이름이 하나인 줄 에만 작동합니다 .

입력하다

(bookmarks
 ("Cover"
  "#01.djvu" )
 ("Title page"
  "#all_24223_to_00243.cpc0002.djvu" )
 ("Preface"
  "#all_24223_to_00243.cpc0004.djvu" )

산출

(bookmarks
 ("Cover"
  "#2.djvu" )
 ("Title page"
  "#3.djvu" )
 ("Preface"
  "#5.djvu" )

관련 정보