나는 이런 문자열을 가지고있다
TEST="/dev/sda1 on /media/sda1 type vfat (rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=cp437,iocharset=iso8859-1,quiet)"
(의 결과 mount | grep sda1
)
마운트 지점이 어디에 있는지 일치시키고 싶습니다. 내 정규 표현식(여기에서 채택) 예
(?<=on[ \t])(.*)(?=[ \t]type)
하지만 어떤 이유로 내 여러 도구(Busybox ash 1.14.2)에서는 작동하지 않습니다.
echo $TEST | grep -o -e '(?<=on[ \t])(.*)(?=[ \t]type)'
나에게 어떤 결과도주지 않았습니다.
echo $TEST | awk 'match($0, /(?<=on )(.*)(?= type)/){print $0}'
반환 오류awk: bad regex '(?<=on[ ])(.*)(?=[ ]type)': Invalid preceding regular expression
expr match "$TEST" '\(?<=on[ \t]\)\(.*\)\(?=[ \t]type\)'
또한 빈 결과를 반환합니다.
조금 바보 같은 느낌이 듭니다.
답변1
Lookaround는 Perl 정규식 기능입니다. GNU grep은 이를 구현합니다( -P
옵션을 사용하여). busybox 명령이 작동하는지 말할 수 없습니다.
하지만 이 경우에는 "on" 이후에 일자리를 찾고 있을 뿐입니다. 하나를 선택하세요
echo "$TEST" | awk '{for (i=1; i<=NF; i++) if ($i == "on") {print $(i+1); break}}'
echo "$TEST" | sed 's/.*on[[:blank:]]\(.*\)[[:blank:]]type.*/\1/'