sed(정규식 사용)를 사용하여 지정된 문자열(수학에서 시작)을 특정 위치(열 20)로 이동하려면 어떻게 해야 합니까? 각 행의 수학으로 시작하는 문자열을 20열로 이동하고 수학 문자열이 항상 행의 마지막 단어에 있도록 하고 싶습니다.
how are you math123
good math234
try this math500
답변1
만약 당신이 정말로~ 해야 하다를 사용 sed
하면 가능한 알고리즘 중 하나는 문자열 앞에 math
18자 이하의 공백을 추가하는 것입니다.
$ 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
. 오른쪽은 "math" 문자열이 될 수 있고 왼쪽은 무엇이든 될 수 있습니다.- 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