두 문자열 사이의 텍스트를 추출하는 방법

두 문자열 사이의 텍스트를 추출하는 방법

이와 같은 문자열이 있고 두 문자열 사이의 텍스트를 추출하려고 합니다.

예:

[{a12:12},{b12:1},{m12:34},{b12:2},{k12:45}]

b12와 사이의 고유한 값을 추출하고 싶은데 },{m12:원하는 출력은 입니다 1.

시도했지만 sed예상한 결과를 얻지 못했습니다. 여러 번 발생했기 때문에 확실하지 않은 경우 b12조언이 도움이 될 것입니다.

답변1

입력이 유효한 JSON이라고 가정합니다.

[{"a12":12},{"b12":1},{"m12":34},{"b12":2},{"k12":45}]

jq... key를 사용하여 최상위 배열의 첫 번째 요소를 추출한 b12다음 해당 요소에서 키 값을 추출하는 데 사용할 수 있습니다 .

jq 'map(select(has("b12"))) | first.b12' file

키 이름을 명령줄 인수로 전달합니다.

jq --arg k 'b12' 'map(select(has($k))) | first[$k]' file

답변2

다음을 지정하여 sed추출 할 수 있습니다.1일치 그룹당신이 제공하는 문자열 사이. 그건 그렇고, 당신은 b12과 사이의 문자열을 원한다고 말했지만 },{m12:이 경우의 출력은 입니다 :1. 따라서 실제로 원하는 것은 b12:과 사이의 텍스트 입니다 },{m12:.
따라서 코드는 다음과 같아야 합니다.

echo '[{a12:12},{b12:1},{m12:34},{b12:2},{k12:45}]' | sed  's/.*b12:\(.*\)},{m12:.*/\1/'

또는

sed  's/.*b12:\(.*\)},{m12:.*/\1/' <<< '[{a12:12},{b12:1},{m12:34},{b12:2},{k12:45}]'

이 모드는 이전에 가지고 있던 모든 것을 s/.*b12:\(.*\)},{m12:.*/\1/대체합니다 (b12:.*b12:) 그리고 그 이후의 모든 항목도 대체됩니다 },{m12:(},{m12:.*) 일치하는 그룹별. 일치 \(.*\)그룹(당신의 경우에는1) 패턴은 \1이를 나타냅니다.

노트
sed명령을 사용하면 다음과 같은 일이 발생할 수 있습니다."질문". 예를 들어 다음과 같은 추가 콘텐츠가 있는 경우 m12:

'[{a12:12},{b12:1},{m12:34},{b12:2},{m12:45}]'
'[{a12:12},{b12:1},{m12:34},{b12:2},{m12:10},{m12:45}]' 

출력은 (각각) 다음과 같습니다.

2
2},{m12:10

따라서 원하는 것을 수행하는 가장 좋은 방법은 다음을 사용하는 것입니다.코살로난다의 답변


당신은 읽을 수있다이것그리고이것방법을 이해할 수 있다일치 그룹일하다.

관련 정보