one.txt
내용은 다음과 같습니다.
Hi this is the first line in a file one.txt
cooler:some default cooler string `/var/log/cooler_x86_64_someos8.4/config.cf'
doing good nice!
all is well
Hi this is the lastline in a file one.txt
예상 출력
/var/log/cooler_x86_64_ubantu.8.24/config.cf
나는 다음과 같이 필요합니다
cat one.txt | grep cooler | sed somergexp
밝히다:
예, 백틱 먼저, 작은따옴표 마지막
`/var/log/cooler_x86_64_someos8.4/config.cf'
sed
다음 두 가지를 사용하여 할 수 있습니다
sed 's:^.*\(`.*\)'\''.*$:\1:'| sed 's/`//'
sed
하지만 한 번의 호출로 완료 해야 합니다 .
답변1
난 이 문제를 해결할 수 있어sed 's:[^/]*\(.*\)'\''.*$:\1:'
답변2
sed -n -r '/^cooler/s|.*['\''`"]([^'\''"`]+).*|\1|gp' one.txt
-n
무음
/^cooler/
모드
gp
- 출력 결과
.*['\''`"]
- 따옴표 앞의 문자 그룹(''`")
([^'\''"`]+)
- 따옴표 뒤의 문자 그룹(다음 따옴표(''`") 제외)
답변3
먼저 관심선을 선택해 보겠습니다. 줄은 다음 문자열로 시작됩니다 cooler:
.
$ sed -e '/^cooler:/!d' file
cooler:some default cooler string `/var/log/cooler_x86_64_someos8.4/config.cf'
이 표현식은 /^cooler:/!d
입력에서 일치하지 않는 모든 행을 제거합니다 /^cooler:/
.
그런 다음 백틱과 따옴표 사이에 있는 내용을 추출합니다.
$ sed -e '/^cooler:/!d' -e "s/.*\`\([^']*\)'.*/\1/" file
/var/log/cooler_x86_64_someos8.4/config.cf
이 표현식은 s/.*\`\([^']*\)'.*/\1/
전체 줄을 의 문자열로 바꿉니다 `...'
. 표현식이 큰따옴표 안에 있으므로 백틱을 이스케이프해야 합니다(그렇지 않으면 쉘에서 명령 대체가 시작됩니다).
두 단계로 경로를 추출할 수도 있습니다. 백틱 앞의 모든 내용(백틱 포함)을 제거한 다음 작은따옴표 뒤의 모든 내용(작은따옴표 포함)을 제거합니다. 이 방법이 더 깔끔해 보일 수도 있습니다.
$ sed -e '/^cooler:/!d' -e 's/.*`//' -e "s/'.*//" file
/var/log/cooler_x86_64_someos8.4/config.cf
답변4
$ sed -ne '
/^cooler:/y/`'\''/\n\n/
s/.*\n\(.*\)\n.*/\1/p
' one.txt
이것은 posix sed입니다. 따옴표와 백틱을 개행 문자로 변경합니다. 그런 다음 경로는 두 줄 바꿈 사이에 끼워집니다.