sed는 따옴표 안의 단어를 대체합니다.

sed는 따옴표 안의 단어를 대체합니다.

아래와 같은 줄이 포함된 파일이 있습니다. -s따옴표 안의 단어를 바꾸고 따르기를 원합니다 -e. 시도했지만 sed성공하지 못했습니다.

문서 내용

abc -s "today" -e "today" def
abc -s "yesterday" -e "yesterday" def
abc -s "3 days ago" -e "3 days ago" def

시도한 명령

sed 's|-s "*" -e "*"|-s "1" -e "2"|g' <filename>

원하는 출력

abc -s "1" -e "2" def
abc -s "1" -e "2" def
abc -s "1" -e "2" def

답변1

자신의 시도에서 가장 큰 문제는 이것이 "*""0개 이상의 큰따옴표와 다른 큰따옴표가 뒤따르는 일치"를 의미한다는 것입니다. *"이전 표현식이 0개 이상"을 의미하는 정규식 수식어이기 때문입니다 . 이는 , 등과 같은 문자열 "*"과 일치한다는 것을 의미합니다.""""""

게다가 명령에 서로 다른 구분 기호를 사용할 필요가 없으며 s///한 줄에 여러 개의 대체 문자를 원하지 않더라도 끝에 구분 기호를 사용할 수 있습니다. /g그러나 이것은 단지 스타일에 관한 질문일 뿐입니다.


이를 수행하는 방법은 여러 가지가 있지만 sed모든 방법은 어떤 방식으로든 큰따옴표 사이의 문자열과 일치해야 합니다. 큰따옴표 사이의 문자열은 "[^"]*""큰따옴표와 일치하고, 0개 이상의 큰따옴표가 아닌 문자와 또 다른 큰따옴표 문자가 뒤따르는" 정규식으로 일치될 수 있습니다 .

$ sed -e 's/-s "[^"]*"/-s "1"/' -e 's/-e "[^"]*"/-e "2"/' file
abc -s "1" -e "2" def
abc -s "1" -e "2" def
abc -s "1" -e "2" def

위에서 2개를 사용함분리표현식은 주어진 옵션 뒤에 오는 문자열과 일치하고 대체합니다. 이는 또한 다음을 의미합니다.

  • 입력에 제공된 옵션의 순서는 중요하지 않습니다( -s "whatever"항상 으로 대체되고 -s "1"항상 -e "whatever"으로 대체됨 -e "2").
  • 옵션 사이의 공백 수를 무관하게 만듭니다(예: 옵션과 옵션 인수 사이에 여러 공백을 허용하도록 -s "[^"]*"변경됨 ).-s *"[^"]*"
  • 다른 옵션이 있는지 여부(또는 해당 옵션이 -s-e옵션과 관련하여 어떻게 정렬되는지)는 중요하지 않습니다.
  • -s둘 중 하나만 있고 -e나머지는 없는 경우 기존 옵션과 옵션 인수가 대체됩니다.

다음으로 시작하는 줄만 바꿔야 하는 경우 abc:

sed -e '/^abc/{' -e 's/-s "[^"]*"/-s "1"/' -e 's/-e "[^"]*"/-e "2"/' -e '}' file

-e또는 다음 옵션이 모두 없는 명령은 다음과 같습니다 sed.

sed '/^abc/{ s/-s "[^"]*"/-s "1"/; s/-e "[^"]*"/-e "2"/; }' file

수정하는 줄이 로 끝나는지도 확인해야 하는 경우 /^abc/로 변경하세요./^abc.*def$/def

답변2

Sed는 와일드카드 패턴이 아닌 정규식을 사용합니다. *"이전 요소를 0번 이상 반복"을 의미하며, ."무엇이든"을 의미하는 반복이 필요합니다.

sed 's/-s ".*" -e ".*"/-s "1" -e "2"/'

관련 정보