일치하는 문자열의 n번째 위치에 문자를 추가합니다.

일치하는 문자열의 n번째 위치에 문자를 추가합니다.

길이가 10인 일치하는 문자열의 n번째 위치에 문자를 삽입하는 sed/awk 명령을 찾아야 합니다. 예를 들어, 패턴으로 시작 541하고 길이가 10인 문자열을 검색한 다음 9대체 없이 5번째 위치에 문자열을 삽입하면 11자 문자열이 생성됩니다.

문자열은 공백으로 구분된 단어입니다. 또한 패턴은 항상 단어의 시작 부분에 있지만 한 줄에 여러 개의 일치 항목이 있을 수 있습니다.

입력 파일:

5414444444 87654873234  88888888888
6646666666 54122222222 
54155555558888 54176543235 5416666666

결과물 파일:

54149444444 87654873234  88888888888
6646666666 54122222222 
54155555558888 54176543235 54169666666

답변1

OP는 a가 그렇지 word않다는 것을 의미한다는 것을 예에서 볼 수 있습니다.string

sed 's/\b541./&9/g' file

Word에서 다른 곳에서 시작하는 것이 가능한 경우 541(처음부터가 아님)

sed 's/\b\S*541/\n&/g     #mark a beginning of word(s) with pattern
     s/\n\(....\)/\19/g   #remove mark and do adding
    ' file

다음과 같이 단어의 기호 수를 제한할 수 있습니다.

sed 's/\b\(541.\)\(\S\{6\}\)\b/\19\2/g' file

또는 더 일반적으로

sed 's/\b541./&\n/g;s/\n\S\{6\}\b/9&/g;s/\n//g' file

답변2

펄을 사용할 수 있습니다

perl -lane 'map{length==10&&/^541/&&s/.{4}/$&9/}@F;print join(" ",@F)' file

맵을 사용하여 각 필드에 대한 확인 및 하위 작업을 수행합니다. 그런 다음 단일 공백으로 연결된 필드 배열을 인쇄합니다(필드 사이의 단일 공백이 일치하지 않으면 서식이 엉망이 됩니다).

아니면 그냥 정규식을 사용하세요

perl -lane 'map{s/^541.\K.{6}$/9$&/}@F;print join(" ",@F)' file

산출:

54149444444 87654873234 88888888888
6646666666 54122222222
54155555558888 54176543235 54169666666

답변3

가지고 다닐 수 있는:

sed '
  s/.*/ & /; # add a leading and trailing space
  :1
    s/\([[:blank:]]541[^[:blank:]]\{2\}\)\([^[:blank:]]\{5\}[[:blank:]]\)/\19\2/g
    # replace in a loop until there is no more match
  t1
  # remove the blanks we added earlier:
  s/^ //;s/ $//'

후행/선행 공백 외에도 목록의 시작 또는 끝에서 공백이 아닌 10개의 문자열이 나타나는지 찾아 선행 및 후행 공백이 일시적으로 추가되는 것을 방지할 수 있습니다. 이는 정규식을 사용하여 POSIX 방식으로 수행할 수 있지만 약간 불편합니다.

sed '
  :1
    s/^\(\(.*[[:blank:]]\)\{0,1\}541[^[:blank:]]\{2\}\)\([^[:blank:]]\{5\}\([[:blank:]].*\)\{0,1\}\)$/\19\3/
  t1'

그리고 perl다음과 같이 둘러보기 연산자를 사용하세요.

perl -lpe 's/((?<!\H)541\H\H)(\H{5})(?!\H)/${1}9$2/g'

또는 단어를 하나씩 처리합니다.

perl -lpe 's{\H+}{$&=~s/^541..\K.{5}$/9$&/r}ge'

( \K그리고 r교체 플래그에는 상대적으로 새로운 버전이 필요합니다 perl).

관련 정보