sed 명령을 사용하여 텍스트 파일에서 경로 추출

sed 명령을 사용하여 텍스트 파일에서 경로 추출

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입니다. 따옴표와 백틱을 개행 문자로 변경합니다. 그런 다음 경로는 두 줄 바꿈 사이에 끼워집니다.

관련 정보