
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
- b) 정규 표현식이 성공하면 다음으로 확인되는 것은 위치가 19보다 작은지 확인하는 것입니다. 그렇지 않으면 루프를 중단합니다
- a)
결과
1 2 3
123456789012345678901234567890
good math234
how are you math123
1234567890
good math234
try this math500
math101 is enough math