문자열을 대체하는 스크립트를 작성했지만 공백 문자 10개를 다시 추가해야 합니다. 나할 수 있는스페이스바를 10번 누르면 다시 추가되고 작동하지만 내 스크립트에서는 끔찍해 보입니다.
내 스크립트:
sed -i 's/server.os[ \t]*$freebsd/server.os $linux/g' ~/var/log.txt
다음과 같은 것을 사용하여 server.os
사이에 10개의 공백 문자를 추가하고 싶습니다.$linux
{whitespace*10}
노트:
- 앞에 10개의 공백 문자가 있으므로
$freebsd
다음을 사용합니다.[ \t]*
$
이 경우 변수가 아닙니다. 그것은 단지 문자열의 일부일 뿐입니다.
입력 예:
server.os $freebsd
원하는 출력:
server.os $linux
답변1
무엇이든 캡처하세요(10개, 그 이상, 더 적음 또는 없음) 원래 문자열에서 연속된 공백과 탭을 그룹화한 ([ \t])
다음 이스케이프 참조 번호를 기준으로 대체 문자열에 다시 넣습니다. \1
이 경우에는 다음과 같습니다.
sed -E 's/server\.os([ \t]*)\$freebsd/server.os\1$linux/g'
참고: 왼쪽의 모든 항목은 정규식으로 처리되므로 .
및를 이스케이프 처리해야 합니다 .$
답변2
기존 공백을 캡처해야 하는 경우(새 사용 사례):
$ sed 's/\(server.os[ \t]*\$\)freebsd/\1linux/' file
server.os $linux
존재하지 않는 공간을 만들어야 하는 경우(이전 사용 사례):
입력 파일:
$ cat file
server.os $freebsd
sed
요청에 따라 GNU를 사용하십시오.
sed -E 's/(server\.os[ \t]*\$)freebsd.*/printf "%s%10s" \1 linux/e' file
그리고 Perl
:
$ perl -pe 's/(server\.os)[ \t]*\$freebsd.*/$1 . " " x 10 . "linux"/e' file
server.os $linux
를 사용하면 -i
다음과 같이 동작합니다 sed -i
.대기줄.
교체 부품의 작동 방식은 다음과 같습니다.
$1
( ... )를 사용하여 정규식의 왼쪽에서 그룹을 캡처합니다..
종속" "
텍스트 공간x 10
곱셈(10회)/e
Perl 코드/함수/표현식 전달을 허용하는 수정자(예, 매우 강력합니다.
답변3
source_txt='server.os[ \t]*$freebsd'
replace_txt=$(printf 'server.os%10s$linux')
sed -i "s/$source_txt/$replace_txt/g" ~/var/log.txt
printf
이는 서식 있는 텍스트를 만드는 데 사용됩니다. 바라보다매뉴얼 페이지도움을 요청. 내장 쉘과 POSIX입니다. 모든 쉘에서 작동해야 합니다.