작은따옴표 사이의 단어 바꾸기

작은따옴표 사이의 단어 바꾸기

bash의 fil에서 작은따옴표 사이의 단어를 바꾸려고 하는데 sed를 사용해 보았지만 작동하지 않습니다.

문서 내용

Haarlem -m 'foo' -n 'bar' aalsmeer > "goes to" -t 'value'
Roterdam -m 'foo2' -n 'bar2' amsterdam > "goes to" -t 'value'

예상 출력

Haarlem -m "verified" -n "verified" aalsmeer > "goes to" -t 'value'
Roterdam -m "verified" -n "verified" amsterdam > "goes to" -t 'value'

아래 sed 명령이 작동하지 않습니다

sed 's/-m '*.*' -n '*.*'/-m "verified" -n "verified"/'

답변1

여기서 큰따옴표를 사용할 수 있습니다.

$ sed "s/'[^']*'/\"verified\"/g" ip.txt
Haarlem -m "verified" -n "verified" aalsmeer > "goes to"
Roterdam -m "verified" -n "verified" amsterdam > "goes to" 
  • '[^']*''문자가 아닌 문자 '뒤에 '문자가 오는 것과 일치합니다 .
    • 첫 번째 입력줄부터 마지막 '.*'​​입력줄 까지 일치하므로 사용할 수 없습니다.''
  • \"verified\"대체 문자열 로 사용되는 경우 "verified"큰따옴표는 큰따옴표 안에 사용되기 때문에 이스케이프됩니다.

또한보십시오:https://mywiki.wooledge.org/Quotes그리고내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?(정규식과 와일드카드의 차이점)


위의 해결 방법 이후 질문이 업데이트되었습니다.

$ cat ip.txt
Haarlem -m 'foo' -n 'bar' aalsmeer > "goes to" -t 'value'
Roterdam -m 'foo2' -n 'bar2' amsterdam > "goes to" -t 'value'

$ sed -E "s/(-[mn] )'[^']*'/\1\"verified\"/g" ip.txt
Haarlem -m "verified" -n "verified" aalsmeer > "goes to" -t 'value'
Roterdam -m "verified" -n "verified" amsterdam > "goes to" -t 'value'
  • -[mn]일치 -m하거나-n
  • (-[mn] )캡처 그룹이며 일치하는 콘텐츠는 교체 부분에서 다음과 같이 재사용됩니다.\1

당신은 또한 사용할 수 있습니다

sed -E "s/(-[^t] )'[^']*'/\1\"verified\"/g" ip.txt

대체 만 방지하고 공백이 앞에 오는 다른 모든 작은따옴표 패턴 -t '..'과 일치합니다.-<char>

답변2

Sundeep의 답변에 감사드립니다. 하지만 데이터를 얼마나 신뢰하느냐에 따라 더 간단하게 할 수 있습니다.

처음 두 번만 보고 싶으면 동일한 명령을 두 번 호출하면 됩니다. 따옴표 사이에 전체 단어/숫자가 있다고 가정하고 공백이 아닌 문자를 선택합니다. 이는 -E정규식을 확장할 수 있기 위한 것입니다.

테스트 파일

Haarlem -m 'foo' -n 'bar' aalsmeer > "goes to"
Roterdam -m 'foo2' -n 'bar2' amsterdam > "goes to"
$ sed -E \
  -e "s/'\S+'/\"verified\"/" \
  -e "s/'\S+'/\"verifired\"/" test_file
#  
# Haarlem -m "verified" -n "verifired" aalsmeer > "goes to" -t 'value'
# Roterdam -m "verified" -n "verifired" amsterdam > "goes to" -t 'value'

관련 정보