특정 위치의 공백 바꾸기

특정 위치의 공백 바꾸기

아래와 같은 텍스트 파일이 있습니다.

데이터.txt

12345678909876456    qwerty
1234567890987       qwerty
23456789011234567   qwerty

나는 그것을 다음과 같은 방식으로 보여주고 싶다.

  1. 11번에서 20번을 대체하게 된다.
  2. 해당 위치 사이의 모든 공백은 "0"으로 대체됩니다.
  3. 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

관련 정보