Bash - 문자열에서 문자 추출

Bash - 문자열에서 문자 추출

다음과 같은 변수가 있다고 가정해 보겠습니다.

$string = 'cat somecommandhere'

이제 위 명령의 출력은 다음 cat과 같습니다.

test="Thanks serverfault"

따옴표 사이의 값을 추출하여 $string따옴표를 포함하여 동일한 변수에 저장하고 싶습니다. 문자열에 다음 값이 포함되기를 원합니다.

$string = "Thanks serverfault"  

sedgrep또는 대신에 이것을 어떻게 할 수 있습니까 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"

관련 정보