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'