sed를 사용하여 10개의 공백 문자를 추가하세요.

sed를 사용하여 10개의 공백 문자를 추가하세요.

문자열을 대체하는 스크립트를 작성했지만 공백 문자 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. $1( ... )를 사용하여 정규식의 왼쪽에서 그룹을 캡처합니다.
  2. .종속
  3. " "텍스트 공간
  4. x 10곱셈(10회)
  5. /ePerl 코드/함수/표현식 전달을 허용하는 수정자(예, 매우 강력합니다.

답변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입니다. 모든 쉘에서 작동해야 합니다.

관련 정보