다음과 같은 변수가 있다고 가정해 보겠습니다.
$string = 'cat somecommandhere'
이제 위 명령의 출력은 다음 cat
과 같습니다.
test="Thanks serverfault"
따옴표 사이의 값을 추출하여 $string
따옴표를 포함하여 동일한 변수에 저장하고 싶습니다. 문자열에 다음 값이 포함되기를 원합니다.
$string = "Thanks serverfault"
sed
grep
또는 대신에 이것을 어떻게 할 수 있습니까 awk
? 아직 배우지 않았습니다 awk
.
답변1
이것이 "두 번째 부분"을 의미하고 큰따옴표를 자르는 것을 의미한다고 cut
추론하기 쉽기 때문에 사용하겠습니다 .-f2
-d'"'
$ output='test="Thanks serverfault"'
$ string=$( echo $output | cut -f2 -d'"' )
$ echo $string
Thanks serverfault
정말로 인용문을 원할 경우 직접 다시 추가하면 답변이 필요 이상으로 혼란스러워 보일 뿐입니다.
정말로 사용하고 싶다면 sed
(다행히도 따옴표도 보존됩니다):
$ output='test="Thanks serverfault"'
$ string=$( echo $output | sed 's/^test=//' )
$ echo $string
"Thanks serverfault"
설명 sed
:
s/^test=//
string find/replace mode ^ | ^ replace with nothing
starts with test=
답변2
sed가 필요하지 않습니다. bash 및 sh에는 내장된 변수 수정자가 있습니다.
$ output='test="Thanks serverfault"'
$ string=\"${output#*\"}
$ string=${string%\"*}\"
$ echo $string
"Thanks serverfault"
# 접두사를 제거합니다. %는 접미사입니다.
이는 외부 프로그램을 호출하는 것보다 빠릅니다.
답변3
아마도 다른 사용자들이 가장 좋은 대답을 했을 것입니다. sed가 필요하지 않습니다. 하지만 필요한 경우 다음과 같이 작동합니다.
sed 's/.*=//' #this will remove everything before (inclusive) of the equal.
답변4
pcregrep을 사용하십시오:
string=$(eval " $string" | pcregrep -Mo '(?s)"(\\.|[^"])*"')
셸 코드로의 내용을 평가하고 $string
출력에서 큰따옴표로 묶인 문자열을 추출하고, 이스케이프된 "
s 및 s를 처리 \
하고, 에 줄바꿈으로 구분하여 저장합니다 $string
.
예를 들어 다음이 포함 file=some-file string='cat < "$file"'
됩니다 some-file
.
test="Thanks serverfault"
test2="with \"quotes\" and backslash\\" test3="multi
line"
$string
최종적으로는 다음이 포함됩니다.
"Thanks severfault"
"with \"quotes\" and backslash\\"
"multi
line"