sed를 사용하여 파일에서 줄의 일부 추출

sed를 사용하여 파일에서 줄의 일부 추출

파일에서 한 줄의 일부를 읽고 싶습니다. 예를 들어:

POP3_SERVER_NAME = 로컬호스트

나는 단지 localhostsed를 사용하여 돌아오고 싶습니다.

이 텍스트는 세 번째 줄에 있습니다. 나는 라인을 추출하기 위해 이것을 수행합니다 :

sed -n '3p' installation.sh

부분 만 추출하는 방법은 무엇입니까 localhost?

답변1

awk는 아마도 여기서 더 나은 도구일 것입니다.

$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost

"POP3_SERVER_NAME"이 포함된 줄을 검색하고 마지막 필드를 인쇄하세요. 이는 POP3_SERVER_NAME이 항상 3번 라인에 있다는 것에 의존하지 않으며 이는 아마도 좋은 일입니다.

$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost

애플리케이션에 따라 정규식을 더 엄격하게 만들어야 할 수도 있습니다. 예를 들어 다음 줄만 일치시키고 싶을 수도 있습니다.시작POP3_SERVER_NAME로.

$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost

sed를 사용하는 것은 그리 직관적이지 않습니다. (고맙습니다. 비꼬는 말인 줄 압니다.) POP3_SERVER_NAME이 포함된 줄을 어디서나 찾으세요. 줄 시작 부분부터 "=" 뒤의 선택적 공백까지의 모든 텍스트를 빈 문자열로 바꿉니다. 그런 다음 인쇄하십시오.

sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat

답변2

p행에서 원하지 않는 부분을 제거하는 대체 명령으로 명령을 바꾸십시오 .

sed -n '3 s/^[^=]*= *//p' installation.sh

위치가 아닌 키워드를 기준으로 행을 일치시킬 수 있습니다.

sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh

답변3

이미 구성 파일이 있는 것 같습니다. 당신이 할 수 있는 일은 Adam Siemeon/slm이 제안한 것과 유사합니다:

sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename

이는 [^=]모든 '=' 문자를 제외합니다. +이는 동일한 유형의 하나 이상의 문자 뒤에 실제 공백(탭 및 줄 바꿈 포함 , 순수 공백 '' 포함) =이 뒤따르고 동일한 유형이 0개 이상 있음을 의미하는 대괄호입니다. 줄의 끝을 나타내는 \1, \2, ..., \n 대체 자리 표시자에 일치하는 문자 시퀀스를 배치하여 내부 내용을 캡처합니다 . 이는 다음과 같은 일반적인 대체 패턴을 따릅니다. 명령줄 옵션은 확장 일반으로 표시됩니다. 표현식 구문(편의상). 명시적으로 요청하기 전까지는 아무 것도 출력되지 않음을 의미합니다.\s\t\n\r\n*$s/.../.../modifiers-r-np

수정자를 사용하여 전역적으로 검색할 수 있습니다 g. 예를 들면 다음과 같습니다.

sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename  # note the space after \1

' '이렇게 하면 (can be \n또는 what have you)로 \t구분된 문자열을 얻고 쉽게 처리할 수 있습니다.

값 앞에 등호 문자가 있고 줄 끝까지 확장되며 의미가 단순한 "값"에서 벗어나는 주석이나 기타 문자가 뒤에 오지 않는 경우 둘 다 유효합니다.


편집하다:

여기에서는 아직 다른 사람의 게시물에 댓글을 달 수 없습니다. 줄을 표시하려면 여는 s따옴표 문자 앞이나 앞에 줄 번호(귀하의 경우 3)를 전달하면 됩니다(vim에서와 마찬가지로).

sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename

이것을 봐주세요 info sed. 예를 들어, 특히 3.2와 4.7에 관심이 있습니다.

답변4

echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost

또는 파일에 콘텐츠가 있는 경우:

sed 's/.*= //' somefile.txt
localhost

관련 정보