아래와 같이 unix/Linux 괄호 사이의 단어를 바꾸고 싶습니다. 코드 하나만 포함하면 작업이 쉬워지도록 이를 자동화하려고 합니다.
내 ksh 스크립트에 다음 문자열이 있습니다
echo "Export file to below names (ABC, DEF, GHI)"
나는 다음과 같이 되고 싶다
echo "Export file to below names ('ABC', 'DEF', 'GHI')"
답변1
$ echo "Export file to below names (ABC, DEF, GHI)" | sed -e "s/\([A-Z][A-Z][A-Z]\)/'\1'/g"
Export file to below names ('ABC', 'DEF', 'GHI')
답변2
Perl에서는 거의 읽을 수 있는 방식으로:
echo "Export file to below names (ABC, DEF, GHI)" |
perl -lne '@a = /(.*\()(.*)(\).*)/; $a[1] =~ s/\w+/\x27$&\x27/g; print @a'
첫 번째 일치 항목은 행을 세 부분으로 분할하고 모든 (.*\()
항목, 즉 여는 괄호( ) 앞의 모든 항목, 모든 항목( (.*)
) 및 닫는 괄호( (\).*)
) 앞의 모든 항목을 캡처합니다. 이를 배열에 넣고 @a
두 번째 요소를 교체합니다(0부터 계산). s/\w+/\x27$&\x27/g
"단어 문자"( )와 일치하는 문자열을 작은따옴표로 묶인 일치하는 부분(from)으로 바꿉니다
\w+
. $&
따옴표는 쉘과의 성가신 인용 댄스를 피하기 위해 16진수로 이스케이프됩니다.
물론 Perl을 사용하면 다른 대체 내에서 sed 스타일 대체를 수행하는 것과 같이 읽을 수 없는 작업도 수행할 수 있습니다.
echo "Export file to below names (ABC, DEF, GHI)" |
perl -pe 's,\(.*\), $_ = $&; s/\w+/\x27$&\x27/g; $_ ,e; '
Export file to below names ('ABC', 'DEF', 'GHI')
여기서 final은 e
외부 교체가 교체를 Perl 코드 조각으로 해석하도록 하고, 여기에서 일치하는 부분을 가져와 $&
위와 같이 편집합니다. 읽기 전용이기 $_
때문에 여기서는 임시 변수로 사용하고 있습니다 . $&
교체된 조각을 함수로 이동할 수 있으므로 해당 줄을 더 읽기 쉽게 만들 수 있습니다.