Bash에서는 다음과 같은 파일에서 문자열을 읽었습니다.
"network": "Purple",
grep, awk 또는 sed를 사용하여 "Purple"(따옴표 제외) 문자열만 추출하고 이를 변수에 할당하려면 어떻게 해야 합니까?
마지막에 따옴표와 쉼표를 제거해야 합니다.
어떤 경우에는 "보라색"이라는 단어가 포함되지 않고 다른 색상일 수도 있지만 항상 단일 단어입니다.
다음 코드를 시도해 보았지만 완벽하게 작동하지 못했습니다.
#!/bin/bash
NETWORK=`cat generalInfo.info | grep network | awk '{print $2}'`
if [ $NETWORK -eq "Purple" ]; then
echo "This network is Purple"
else
echo "This network is not Purple"
fi
exit 0
지금까지 이 코드를 사용하면 "보라색"이 표시되지만 주변 따옴표와 쉼표를 제거해야 합니다. awk의 구분 기호로 큰따옴표를 사용하는 것이 더 쉬울까요?
GeneralInfo.info 파일은 json과 같은 형식의 텍스트 파일입니다. jq를 사용하여 파일을 구문 분석할 수 있다는 것을 읽었지만 특정 인스턴스에서는 jq가 설치되어 있지 않아 설치할 수 없습니다.
도움을 주셔서 감사합니다.
답변1
이를 수행하는 방법에는 여러 가지가 있습니다. 그러나 주석에서 이미 언급했듯이 이것이 실제로 구조화된 JSON 데이터인 경우 jq
JSON을 구문 분석하도록 설계된 유사한 것을 조사하고 싶을 수 있습니다 .
언급한 간단한 경우에는 다음과 같은 몇 가지 옵션이 있습니다.
앗
$ echo '"network": "Purple",' | awk '/network/{ gsub(/[",]/,"",$2); print $2}' Purple
GNU grep
$ echo '"network": "Purple",' | grep -oP '"network":\s*"\K[^"]+' Purple
sed
$ echo '"network": "Purple",' | sed -n 's/"network": *"\([^"]*\).*/\1/p' Purple
또는
$ echo '"network": "Purple",' | sed -En 's/"network":\s*"([^"]+).*/\1/p' Purple
마지막으로, 쉘 스크립트에서는 모두 대문자로 된 변수 이름을 사용하지 마십시오. 관례에 따라 전역 환경 변수는 대문자로 표시됩니다. 이는 사용자 고유의 변수 이름도 대문자로 표시하면 혼동을 일으킬 수 있습니다. 스크립트의 특정 경우에는 변수가 필요하지 않습니다. 다음과 같이 스크립트를 다시 작성하겠습니다.
#!/bin/bash
grep -q 'network.*Purple' generalInfo.info &&
echo "This network is Purple" ||
echo "This network is not Purple"
cat
파일이 있는지 확인하기 위해 파일을 만들 grep
거나 변수에 무언가를 저장할 필요가 없습니다 .
답변2
다음을 시도해 볼 sed
수 있습니다.
sed 's/^.*: "\(.*\)",$/\1/' generalInfo.info
이 변형 cut
:
cut -d'"' -f4 generalInfo.info
그리고 grep
:
grep -Po '(?<=": ").*(?=",)' generalInfo.info
답변3
$ var=$(awk -F'"' '$2=="network"{print $4}' file)
$ echo "$var"
Purple