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'