범위 구분 기호에서 세 번째 텍스트 세트 추출

범위 구분 기호에서 세 번째 텍스트 세트 추출

나는파일.txt한 줄을 포함합니다:

[MOVING] From [/source/foo.txt] to [/dest/bar.txt]

기본적으로 대괄호 쌍 내에서 세 번째 그룹을 추출하는 정규식을 찾고 싶습니다.[]

예상하다 /dest/bar.txt

지금까지 나는 다음을 생각해 냈습니다.

$> cat file.txt | grep ".*From.*to.*" | grep -oP  '(?<=to ).*$' | cut -d "[" -f 2 |  cut -d "]" -f 1

작동하지만 우아한 솔루션과는 전혀 다릅니다. 누구든지 이것을 달성하는 방법을 알고 있습니까?

답변1

grep -o '\[[^]]*\]$' file.txt | sed 's/\[//; s/\]//'

그러면 grep이 줄 끝에 고정되고 대괄호와 필요한 텍스트가 추출됩니다. 이 sed명령은 괄호를 제거합니다.

답변2

$ echo "$a"
[MOVING] From [/source/foo.txt] to [/dest/bar.txt]
$ echo "$a" |egrep -o '\[.[^ ]+\]$'
[/dest/bar.txt]

답변3

cut관심 있는 오프닝 브라켓 뒤의 부분을 추출하는 데 사용할 수 있고 , 가공 브라켓 뒤의 부분을 제거하려면 sed 완료를 사용할 수 있습니다.

cut -d '[' -f 3 | sed 's/].*//'

또는 단일 sed 또는 awk 명령을 사용하여 이를 수행할 수 있습니다.

sed 's/^[^[]*\[\([^\]\)]*\][^[]*\[\([^\]\)]*\][^[]*\[\([^\]\)]*\].*$/\3/'
gawk -F '(^|\\])[^[]*(\\[|$)' '{print $4}'
awk '{split($0, a, "(^|\\])[^[]*(\\[|$)"); print a[4]}'

두 awk 명령 모두에서 첫 번째 구분 기호가 문자열의 시작 부분에서 시작하므로 필드 1은 비어 있으므로 세 번째 대괄호 그룹은 필드 4입니다.

관련 정보