아래와 같은 텍스트 파일이 있습니다.
데이터.txt
12345678909876456 qwerty
1234567890987 qwerty
23456789011234567 qwerty
나는 그것을 다음과 같은 방식으로 보여주고 싶다.
- 11번에서 20번을 대체하게 된다.
- 해당 위치 사이의 모든 공백은 "0"으로 대체됩니다.
- 1234로 시작하는 줄 교체만 고려해야 합니다.
지금까지 문자열을 토큰화할 수 있지만 공백을 올바르게 바꿀 수는 없습니다.
sed 's/^1234\(.\{6\}\)\(.\{10\}\)\(.*\)/1234\1Hi\3/' data.txt
그것이 나에게주는 결과는 다음과 같습니다
1234567890Hi qwerty
1234567890Hiqwerty
23456789011234567 qwerty
답변1
거의 다 왔어요... 정규식을 약간 변경하고 문자열 위치 11~20이 더 이상 Space가 아닐 때까지 do-while 루프에 s///를 래핑합니다.
sed -e '
:loop
s/^\(1234.\{6\}[0-9]\{0,9\}\) /\10/
t loop
' file
12345678909876456000qwerty
12345678909870000000qwerty
23456789011234567 qwerty
답변2
또한 몇 가지 방법이 있습니다:
sed '
/^1234/!b
:1
s/^\(.\{10,19\}\) /\10/
t1' < file
perl -pe 'substr($_, 10, 10) =~ y/ /0/ if /^1234/' < file
perl -pe 's{^1234.{6}\K.{10}}{$& =~ y/ /0/r}e' < file
gawk -v FIELDWIDTHS='10 10 *' -vOFS= '
/^1234/ {gsub(/ /, "0", $2)}; {print}' < file
(사용할 때 입력이 UTF-8이거나 로케일의 문자 맵에서 인코딩되거나 ASCII의 문자당 단일 바이트 상위 집합 대신 인코딩된 것으로 간주되는 경우 옵션을 perl
추가합니다 .)-C
-Mopen=locale