파일에서 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
앞으로,
bash
, 및- 유일한 인용문은 마지막 단어 주변의 인용문입니다.
출력의 각 줄을 캡처 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를 시작하는 것을 완전히 이해합니다 ...