sed를 사용하여 지정된 문자열을 특정 위치로 이동

sed를 사용하여 지정된 문자열을 특정 위치로 이동

sed(정규식 사용)를 사용하여 지정된 문자열(수학으로 시작)을 특정 위치(20번째 열)로 이동하는 방법은 무엇입니까? 수학으로 시작하는 문자열을 모든 줄의 열 20으로 이동하고 수학 문자열은 항상 줄의 마지막 단어에 있습니다.

how are you math123 
good math234
try this math500 

답변1

만약 당신이 정말로~ 해야 하다use 를 사용 하는 경우 가능한 알고리즘은 선행 문자가 18개 이하인 한 sed문자열 앞에 공백을 계속 추가하는 것입니다 .math

$ sed -e :a -e 's/\(^.\{,18\}\)math/\1 math/; ta' file
how are you        math123 
good               math234
try this           math500 

문자열의 마지막 항목만 이동하려면 문자열을 줄 끝에 고정하면 됩니다. 예를 들어, 다음과 같은 것이 주어졌습니다.

$ cat file
how are you math123
good math234
try this math500
math101 is enough math

그 다음에후행 공백이 없는 경우

$ sed -e :a -e 's/^\(.\{,18\}\)\(math[^[:space:]]*\)$/\1 \2/; ta' file
how are you        math123
good               math234
try this           math500
math101 is enough  math

sed확장된 정규식 모드가 있는 경우 다음과 같이 단순화할 수 있습니다.

sed -E -e :a -e 's/^(.{,18})(math[^[:space:]]*)$/\1 \2/; ta'

답변2

sed는 수학에 능숙하지 않지만 awk는 수학에 뛰어납니다.

$ awk -Fmath '{printf "%-20smath%s\n",$1,$2}' file
how are you         math123 
good                math234
try this            math500 

이 코드는 가능한 코너 케이스를 올바르게 처리하지 못할 수도 있지만 시작하는 데는 도움이 됩니다.

답변3

perl -pe 's/(?=math)/" " x (19-length($`))/e'      yourfile

perl -pe 's// / while /.*\K(?=math)/g && 19 > pos' yourfile

일하고 있는

  • Perl 옵션은 -p한 줄씩 루프에서 암시적 파일 읽기를 설정합니다. 현재 레코드(일명 라인)가 $_변수에 저장됩니다.
  • 루프 while는 다음을 수행합니다.
    • a) /.*\K(?=math)/g현재 행에서 작동하며 오른쪽에 문자열 "수학"이 있을 수 있고 왼쪽에 아무 것도 없는 위치를 찾습니다 $_.regex
      • b) 정규 표현식이 성공하면 다음으로 확인되는 것은 위치가 19보다 작은지 확인하는 것입니다. 그렇지 않으면 루프를 중단합니다 while.
      • c) 루프 본문은 루프 작업 문 while에서 결정된 위치에 공백을 추가합니다 .while

결과

         1         2         3
123456789012345678901234567890
good               math234
how are you        math123
1234567890
good               math234
try this           math500
math101 is enough  math

관련 정보