stdin을 통한 sed가 예상대로 작동하지 않습니다.

stdin을 통한 sed가 예상대로 작동하지 않습니다.

파일에서 grep하는 줄이 있는데 따옴표 안의 값만 추출하려고 합니다.

$db_name                = "blah";

나는 이 파이프라인을 사용하여 구문 분석하고 있습니다.

| awk '{print $NF}' | tr -d \'\" | sed  -r 's/.$//'

그러나 이로 인해 다음과 같은 결과가 발생하는 것으로 보입니다.

blah;

그러나 나는 sed주문이 마지막 문자를 제거하기를 원합니다. 저도 sed -r사용 해봤는데 sed -e효과는 없는 것 같아요.

각 경우에만 삭제하면 되므로 ;시도해 보았지만 sed 's/;//'여전히 정규식이 작동하지 않는 이유를 알고 싶습니다.

어떤 아이디어가 있나요?

답변1

진주:

| awk '{print $NF}' | tr -d \'\" | perl -lpe 'chop'

행복하다:

| awk '{print $NF}' | tr -d \'\" | raku -pe '.=chop'

입력 예:

echo '$db_name                = "blah";'

샘플 출력(두 가지 코드 예):

blah

https://perldoc.perl.org/functions/chop
https://docs.raku.org/routine/chop

답변2

awk ... | grep ... | sed ...(또는 다른 조합을) 사용하면 심각한 실수를 범하는 것입니다.

awk를 사용하면 모든 것이 awk에서 수행되고, sed를 사용하면 모든 것이 sed에서 수행됩니다. 둘 다 grep이 수행하는 작업을 수행할 수 있습니다.

즉, sed는 마지막 문자를 제거하라고 지시하지 않았기 때문에 마지막 문자를 유지합니다. 다음과 같이 진행하십시오(여기서는 단지마지막따옴표 붙은 문자열. 유사한 것이 여러 개 있는 경우 foo "bar1" bar "bar2""bar2"만 인쇄됩니다.)

your_input | sed 's/.*"\([^"]*\)".*/\1/'

또는

sed 's/.*"\([^"]*\)".*/\1/' /path/to/inputfile

답변3

앞으로,

  1. bash, 및
  2. 유일한 인용문은 마지막 단어 주변의 인용문입니다.

출력의 각 줄을 캡처 grep하고 셸의 텍스트 조작 기능을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

# take advantage of the default behaviour of read
while read; do
    # remove everything upto and including the first "
    lastPart=${REPLY#*\"}
    # remove the second " and everything after it
    wantedPart=${lastPart%\"*}
    echo $wantedPart
done <<<$(grep somePattern someFile)

이는 다른 어떤 것보다 재미있는 연습이며, 강력할 필요는 없으며, 이것이 작동하려면 데이터가 안정적으로 규칙적이어야 합니다. 나는 awk를 시작하는 것을 완전히 이해합니다 ...

관련 정보