정규식을 사용하여 bash에서 검색 및 바꾸기
나는 이 예를 본 적이 있다.
hello=ho02123ware38384you443d34o3434ingtod38384day
echo ${hello//[0-9]/}
구문을 따라갑니다.${variable//pattern/replacement}
도 ★★★★★★★★★★★★★★★.pattern
가 완전한 구문을 ('regex'를 사용하는 )..
★★★★★★★★★★★★★★★★★」\s
예를 들어 리터럴 문자와 일치하려고 합니다).
완전한 regex 구문을 사용하여 문자열을 검색/교환하려면 어떻게 해야 합니까?
sed 사용:
MYVAR=ho02123ware38384you443d34o3434ingtod38384day
echo "$MYVAR" | sed -e 's/[a-zA-Z]/X/g' -e 's/[0-9]/N/g'
# prints XXNNNNNXXXXNNNNNXXXNNNXNNXNNNNXXXXXXNNNNNXXX
의 「」는,-e
을 사용하다 ,,g
식의 플래그는 입력의 모든 항목과 일치합니다.
이 방법을 사용하여 원하는 도구를 선택할 수도 있습니다. 예를 들어 perl, awk 등입니다.
echo "$MYVAR" | perl -pe 's/[a-zA-Z]/X/g and s/[0-9]/N/g'
이렇게 하면 더 창의적인 매치를 할 수 있습니다.를 들어, 위의 첫식에 하는 것이 (게으른 표현으로 ).and
평가)를 참조해 주세요.「Perl」의 「Perl」의 「Perl」의 「Perl」의 「Perl」의 「Perl」의 약칭.
이것은, 실제로는 완전한 bash로 실행할 수 있습니다.
hello=ho02123ware38384you443d34o3434ingtod38384day
re='(.*)[0-9]+(.*)'
while [[ $hello =~ $re ]]; do
hello=${BASH_REMATCH[1]}${BASH_REMATCH[2]}
done
echo "$hello"
...마지막으로...
howareyoudoingtodday
다음 예시는 sed를 사용할 필요가 없는 bash에서도 동작합니다.
#!/bin/bash
MYVAR=ho02123ware38384you443d34o3434ingtod38384day
MYVAR=${MYVAR//[a-zA-Z]/X}
echo ${MYVAR//[0-9]/N}
문자 클래스 괄호 식을 사용할 수도 있습니다.
#!/bin/bash
MYVAR=ho02123ware38384you443d34o3434ingtod38384day
MYVAR=${MYVAR//[[:alpha:]]/X}
echo ${MYVAR//[[:digit:]]/N}
산출량
XXNNNNNXXXXNNNNNXXXNNNXNNXNNNNXXXXXXNNNNNXXX
@ 것은 한 경우, "" 확장자, @Lanaru 확장자, @Lanaru는 왜 PCRE를 사용하는가 하는 입니다.\s\S\w\W\d\D
등에서는 etc php ruby python은 php ruby python으로 합니다.이러한 확장 기능은 Perl-Compatible Regular Expressions(PCRE; Perl 호환 정규 표현)에서 가져온 것으로, 다른 형식의 셸 기반 정규 표현과 호환되지 않을 수 있습니다.
이것들은 동작하지 않습니다.
#!/bin/bash
hello=ho02123ware38384you443d34o3434ingtod38384day
echo ${hello//\d/}
#!/bin/bash
hello=ho02123ware38384you443d34o3434ingtod38384day
echo $hello | sed 's/\d//g'
모든 리터럴 "d" 문자를 제거한 출력
ho02123ware38384you44334o3434ingto38384ay
그러나 다음 사항은 예상대로 작동합니다.
#!/bin/bash
hello=ho02123ware38384you443d34o3434ingtod38384day
echo $hello | perl -pe 's/\d//g'
산출량
howareyoudoingtodday
이것으로 좀 더 명확해졌으면 좋겠지만, 아직 혼란스럽지 않다면 REG_ENHANCHED 플래그가 활성화된 Mac OS X에서 다음을 시도해 보는 것은 어떨까요?
#!/bin/bash
MYVAR=ho02123ware38384you443d34o3434ingtod38384day;
echo $MYVAR | grep -o -E '\d'
*nix의 대부분의 향미에서는 다음 출력만 표시됩니다.
d
d
d
njoy!
콜을 반복하여 퍼포먼스에 관심이 있는 경우 이 테스트에서는 BASH 메서드가 SED 및 기타 외부 프로세스보다 최대 15배 빠른 것으로 나타났습니다.
hello=123456789X123456789X123456789X123456789X123456789X123456789X123456789X123456789X123456789X123456789X123456789X
P1=$(date +%s)
for i in {1..10000}
do
echo $hello | sed s/X//g > /dev/null
done
P2=$(date +%s)
echo $[$P2-$P1]
for i in {1..10000}
do
echo ${hello//X/} > /dev/null
done
P3=$(date +%s)
echo $[$P3-$P2]
[[:digit:]]
는 다음과 같은
$ hello=ho02123ware38384you443d34o3434ingtod38384day
$ echo ${hello//[[:digit:]]/}
howareyoudoingtodday
답변(특히 @nickl-'s https://stackoverflow.com/a/22261334/2916086))을 요약하고 싶습니다.
이것이 스레드라는 것은 구글에서 저는 의 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★resub
$1, $2 등의 백 레퍼런스에 대한 지원이 추가되어 있습니다.
#!/usr/bin/env bash
############################################
### resub - regex substitution in bash ###
############################################
resub() {
local match="$1" subst="$2" tmp
if [[ -z $match ]]; then
echo "Usage: echo \"some text\" | resub '(.*) (.*)' '\$2 me \${1}time'" >&2
return 1
fi
### First, convert "$1" to "$BASH_REMATCH[1]" and 'single-quote' for later eval-ing...
### Utility function to 'single-quote' a list of strings
squot() { local a=(); for i in "$@"; do a+=( $(echo \'${i//\'/\'\"\'\"\'}\' )); done; echo "${a[@]}"; }
tmp=""
while [[ $subst =~ (.*)\${([0-9]+)}(.*) ]] || [[ $subst =~ (.*)\$([0-9]+)(.*) ]]; do
tmp="\${BASH_REMATCH[${BASH_REMATCH[2]}]}$(squot "${BASH_REMATCH[3]}")${tmp}"
subst="${BASH_REMATCH[1]}"
done
subst="$(squot "${subst}")${tmp}"
### Now start (globally) substituting
tmp=""
while read line; do
counter=0
while [[ $line =~ $match(.*) ]]; do
eval tmp='"${tmp}${line%${BASH_REMATCH[0]}}"'"${subst}"
line="${BASH_REMATCH[$(( ${#BASH_REMATCH[@]} - 1 ))]}"
done
echo "${tmp}${line}"
done
}
resub "$@"
##################
### EXAMPLES ###
##################
### % echo "The quick brown fox jumps quickly over the lazy dog" | resub quick slow
### The slow brown fox jumps slowly over the lazy dog
### % echo "The quick brown fox jumps quickly over the lazy dog" | resub 'quick ([^ ]+) fox' 'slow $1 sheep'
### The slow brown sheep jumps quickly over the lazy dog
### % animal="sheep"
### % echo "The quick brown fox 'jumps' quickly over the \"lazy\" \$dog" | resub 'quick ([^ ]+) fox' "\"\$low\" \${1} '$animal'"
### The "$low" brown 'sheep' 'jumps' quickly over the "lazy" $dog
### % echo "one two three four five" | resub "one ([^ ]+) three ([^ ]+) five" 'one $2 three $1 five'
### one four three two five
### % echo "one two one four five" | resub "one ([^ ]+) " 'XXX $1 '
### XXX two XXX four five
### % echo "one two three four five one six three seven eight" | resub "one ([^ ]+) three ([^ ]+) " 'XXX $1 YYY $2 '
### XXX two YYY four five XXX six YYY seven eight
H/T에서 @Charles Duffy로 전송:(.*)$match(.*)
변수 설정
hello=ho02123ware38384you443d34o3434ingtod38384day
그런 다음 var의 regex 치환으로 에코합니다.
echo ${hello//[[:digit:]]/}
다음과 같이 인쇄됩니다.
howareyoudoingtodday
추가 - 반대(숫자 문자 가져오기)를 원할 경우
echo ${hello//[![:digit:]]/}
다음과 같이 인쇄됩니다.
021233838444334343438384
이 입력 예시는 다음과 같습니다.hello ugly world
정규식을 검색합니다.bad|ugly
로 대체하다nice
#!/bin/bash
# THIS FUNCTION NEEDS THREE PARAMETERS
# arg1 = input Example: hello ugly world
# arg2 = search regex Example: bad|ugly
# arg3 = replace Example: nice
function regex_replace()
{
# $1 = hello ugly world
# $2 = bad|ugly
# $3 = nice
# REGEX
re="(.*?)($2)(.*)"
if [[ $1 =~ $re ]]; then
# if there is a match
# ${BASH_REMATCH[0]} = hello ugly world
# ${BASH_REMATCH[1]} = hello
# ${BASH_REMATCH[2]} = ugly
# ${BASH_REMATCH[3]} = world
# hello + nice + world
echo ${BASH_REMATCH[1]}$3${BASH_REMATCH[3]}
else
# if no match return original input hello ugly world
echo "$1"
fi
}
# prints 'hello nice world'
regex_replace 'hello ugly world' 'bad|ugly' 'nice'
# to save output to a variable
x=$(regex_replace 'hello ugly world' 'bad|ugly' 'nice')
echo "output of replacement is: $x"
exit
비단뱀을 사용할 수 있습니다.이 방법은 효율적이지 않지만 좀 더 유연한 구문을 사용하여 작업을 수행합니다.
파일로 신청하다
다음 비단뱀 문자는 "FROM"을 "TO"로 대체합니다("From"이 아님).
regex_replace 입니다.화이
import sys
import re
for line in sys.stdin:
line = re.sub(r'(?<!not)FROM', 'TO', line)
sys.stdout.write(line)
텍스트 파일에 적용할 수 있습니다.
$ cat test.txt
bla notFROM
FROM FROM
bla bla
FROM bla
bla notFROM FROM
bla FROM
bla bla
$ cat test.txt | python regex_replace.py
bla notFROM
TO TO
bla bla
TO bla
bla notFROM TO
bla TO
bla bla
변수로 적용하다
#!/bin/bash
hello=ho02123ware38384you443d34o3434ingtod38384day
echo $hello
PYTHON_CODE=$(cat <<END
import sys
import re
for line in sys.stdin:
line = re.sub(r'[0-9]', '', line)
sys.stdout.write(line)
END
)
echo $hello | python -c "$PYTHON_CODE"
산출량
ho02123ware38384you443d34o3434ingtod38384day
howareyoudoingtodday
언급URL : https://stackoverflow.com/questions/13043344/search-and-replace-in-bash-using-regular-expressions
'programing' 카테고리의 다른 글
터미널에서 Git 트리를 표시할 수 없습니다. (0) | 2023.04.17 |
---|---|
이미지를 배경으로 이동하시겠습니까? (0) | 2023.04.17 |
Swift에서 일련의 취약한 참조를 선언하려면 어떻게 해야 합니까? (0) | 2023.04.17 |
WPF 목록 뷰에서 부드러운 스크롤을 구현할 수 있습니까? (0) | 2023.04.17 |
Swift로 현재 언어 코드를 얻는 방법은 무엇입니까? (0) | 2023.04.17 |