길이가 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
).