sed를 사용하여 특정 패턴 간 교체

sed를 사용하여 특정 패턴 간 교체

sed아침 내내 인터넷 검색을 해보았지만 제대로 작동하지 않는 것 같습니다.

sed으로 가능합니까?소문자두 특정 문자 사이의 텍스트:

SOMENAME=WOODSTOCK,
SOMEOTHERNAME=JIMMY,

내가 할 수 있을까?소문자 WOODSTOCK그리고JIMMY=(우드스톡과 지미에게) 그들은 과 ,?

답변1

GNU sed는 이를 달성할 수 있습니다. 교체가 얼마나 욕심나는지에 따라 이 두 가지 형태 중 하나를 선택하십시오.

sed 's|=.*,|\L&|' file
sed 's|=[^,]*,|\L&|' file

설명서에 적힌대로, " or 가 발견될 \L때까지 대체 내용을 소문자로 변환합니다 ." \U정규식과 일치하는 텍스트입니다.\E&


=.*,탐욕스러운 정규식과 탐욕스럽지 않은 정규식 중에서 현명하게 =[^,]*,선택 해야 함을 보여주기 위해 예제 파일을 수정했습니다.

$ cat file
SOMENAME=WOODSTOCK,
SOMEOTHERNAME2=JIMMY,WOODSTOCK,FINISH
$ sed 's|=.*,|\L&|' file
SOMENAME=woodstock,
SOMEOTHERNAME2=jimmy,woodstock,FINISH
$ sed 's|=[^,]*,|\L&|' file
SOMENAME=woodstock,
SOMEOTHERNAME2=jimmy,WOODSTOCK,FINISH

답변2

모든 POSIX 호환 플랫폼에서 이 기능을 awk사용할 수 있습니다.tolower()

awk -v FS='=' 'BEGIN { OFS = FS } { $2 = tolower($2) }1 ' file

mktemp()기능을 사용하여 위 명령의 출력을 리디렉션하는 임시 파일을 만든 다음 다시 리디렉션하여 저장합니다. 또는 GNU awk>= 4.1을 사용하세요.-i inplace

POSIX 호환 버전의 또 다른 변형은 match()다음 함수를 사용하여 수행할 수 있습니다.

awk 'match($0, /=([^,]*),/) { str = substr($0, RSTART+1, RLENGTH-2); sub(str, tolower(str)) }1'

관련 정보