배관과 함께 'sed'를 사용하는 방법


34

에서 출력 된 문자열을 바꾸고 싶습니다 grep.

$ npm info webpack | grep version 

그것은 나를 출력

$ version: '2.1.0-beta.12',

그러나 나는 가지고 싶다 :

$ 2.1.0-beta.12

그래서 sed불필요한 부분 문자열 을 사용 하고 대체 할 수 있다고 생각 합니다. 그러나 여기에 어려운 부분이 있습니다.

$ npm info webpack | grep version: | sed s/version: /
sed: -e expression #1, char 10: unterminated `s' command

목표를 달성하려면 어떻게해야합니까?

답변:


30

sed를 사용하려는 경우 grep도 사용할 필요가 없습니다. 시험:

npm info webpack | sed -En "s/version: '(.*)',/\1/p"

예:

$ echo  "version: '2.1.0-beta.12'," | sed -En "s/version: '(.*)',/\1/p"
2.1.0-beta.12

대안 : awk 사용

마찬가지로 awk를 사용하면 grep 할 필요가 없습니다.

npm info webpack | awk -F"[ ',]+" '/version:/{print $2}'

예:

$ echo  "version: '2.1.0-beta.12'," | awk -F"[ ',]+" '/version:/{print $2}'
2.1.0-beta.12

작동 방식 :

  • -F"[ ',]+"

    이것은 awk에게 공백, 작은 따옴표 또는 쉼표 또는 이들의 조합을 필드 구분 기호로 사용하도록 지시합니다.

  • /version:/{print $2}

    행에가 포함되어 있으면 version:두 번째 필드를 인쇄하십시오.


2
-E옵션은 분명히 ERE 구문을 사용한다는 것을 의미하지만 내 GNU sed 4.2.2 매뉴얼에는 -r. -E그래도 작동합니다!
Law29

2
@ Law29 예. 그러나 합리적으로 현대의 모든 GNU sed -E문서화되지 않은 동의어입니다 -r. 소문에 따르면 POSIX가 -EBSD / OSX에서 이미 사용하고 있으며 최종 표준에 추가되면 모두로 전환 할 것 -E입니다.
John1024

6

sed대체 명령은 ( s) 검색 패턴 및 대체 문자열을 기대하고있다. 검색 패턴 만 제공했습니다. 쉘에서 문자열을 올바르게 인용해야합니다.

$ npm info webpack | grep 'version:' | sed 's/version: //'

이것은 당신에게 결과를 줄 것입니다 '2.1.0-beta.12',, 그것은 당신이 원하는 것이 아닙니다.

의 출력 grep은 매우 간단하므로 cut구분 기호와 함께 사용 '하여 줄의 두 번째 필드를 얻을 수 있습니다 (복잡한 정규 표현식 필요 없음).

$ npm info webpack | grep -F 'version:' | cut -d "'" -f 2

이것은 당신에게 줄 것이다 2.1.0-beta.12.

또한 검색하는 문자열이 정규식이 아닌 고정 문자열 이기 때문에 추가 -F했습니다 .grep


1

먼저 다음을 사용하십시오 sed.

npm info webpack | grep version: | sed 's/version: //'

또는 다음을 사용할 수 있습니다 awk.

npm info webpack | grep version: | awk '{print $2}'

아마 더 쉬울 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.