프로그래밍에서 우리는 종종일반적인 표현.
가장 일반적인 형태 중 하나는 다음과 같습니다.
newText = text.replace( /regex/, 'replacementString' )
만약에표준 입력이고text
표준 출력예 newText
, 위 코드에 해당하는 bash는 무엇입니까?
답변1
간단한 사용을 위해 다음을 수행할 수 있습니다.
newText=${text/SEARCH/replacement}
설명한대로여기그러나 더 복잡한 표현의 경우 sed는 Alex가 이전에 설명한 것과 같습니다.
답변2
가장 직접적인 대답은sed명령 s
. 정규식 구문을 다음으로 변환해야 합니다.기본 정규식, 교체는 각 행에 연속적으로 적용됩니다. \1
through를 사용하면 \9
원래 문자열에서 괄호로 묶인 그룹을 참조할 수 있습니다. 모든 항목을 대체하려면 수정자를 추가하세요 g
. 그렇지 않으면 첫 번째 항목만 대체됩니다.
sed -e 's/basic regexp/replacement string/g'
보다 유연한 유틸리티는 다음과 같습니다.앗. 기본적으로 입력을 한 줄씩 처리하지만 -vRS=…
)을 사용하여 레코드 구분 기호를 변경할 수 있습니다. 이 sub
함수는 단일 교체를 수행하고 gsub
모든 항목을 교체합니다. 대체 문자열은 문자 그대로 해석됩니다. 단, \
괄호 &
로 묶인 그룹을 참조하려는 경우 match
및 subtring
기능을 사용할 수 있습니다.
awk '{gsub(/regexp/, "replacement string")}'
Bash에는 정규식 일치에 대한 지원이 내장되어 있습니다. [[ text =~ regexp ]]
배열에 저장된 일치하는 하위 문자열을 사용하여 대체 텍스트를 구성할 수 있습니다 BASH_REMATCH
. 입력을 사용 read
하거나 cat
얻고 printf
출력을 내보냅니다. 다음 의사코드는 다중 대체를 수행합니다(경고, 테스트되지 않음; 코드는 평소처럼 왼쪽에서 오른쪽으로 다중 대체를 수행해야 합니다. 제대로 되기를 바랍니다).
# The end marker must not have a prefix that is a suffix of a match of the regexp,
# and must not start or end with a newline
end_marker='EOF'
text=$(cat; echo "$end_marker")
while [[ $text =~ regexp(.*)$ ]]; then
printf %s%s "${text%"$BASH_REMATCH[0]"}" "replacement string"
text=$BASH_REMATCH[$#BASH_REMATCH]
fi
done
printf %s "${text%"$end_marker"}"
(설명할 몇 단어: 닫는 태그는 명령 대체에 의해 후행 개행 문자가 제거되는 것을 방지하기 위한 것입니다. ${text%"$BASH_REMATCH[0]"}
일치 항목 앞의 텍스트 부분을 추출합니다. ^(.*)
정규식 시작 부분에서는 사용할 수 없습니다. 그렇지 않으면 다음과 같은 결과를 얻게 됩니다. 첫 번째 A 일치 대신 마지막 일치. 일치 후 접미사를 반복하고 마지막으로 닫는 태그를 뺀 나머지 일치 항목을 인쇄합니다.
와일드카드 일치 및 제한된 대체 텍스트 기능에 만족한다면 bash는 ${variable/pattern/replacement}
모든 항목을 대체하기 위해 첫 번째 슬래시를 .double로 지정합니다. 이 옵션이 설정 되면 extglob
패턴은 정규식의 기능을 가지게 됩니다(그러나 특이한 구문을 사용함).
답변3
man sed
sed s/regex/replacementString/g
답변4
sed
및 같은 도구를 사용할 수 있지만 awk
제 생각에는 이 도구는 매우 구식이며 좁게 정의된 작업에만 유용합니다.
더 나은 옵션은 STDIN을 Perl 단일 라이너 또는 스크립트로 리디렉션하는 것입니다. Perl의 정규식 지원은 매우 훌륭하여 이제 대부분의 다른 언어도 이들과의 호환성을 지원합니다. sed와 awk를 Perl로 직접 변환하는 a2p
도구 도 있습니다 . s2p
Perl을 사용하면 전체 CPAN을 사용하여 문제를 해결할 수 있습니다.
Perl이 마음에 들지 않으면 Python을 사용하여 비슷한 기능을 얻을 수 있습니다.