나는 메모리 주소 묶음을 나타내는 부호 없는 long 목록과 두 괄호 안의 오프셋(예: Mem[offset]
, 0x2322AD4[3]
) 및 기타 데이터를 포함하는 데이터베이스를 가지고 있습니다. 내가 달성하고 싶은 것은 왼쪽 대괄호를 단일 공백으로 바꾸고 오른쪽 대괄호를 제거하여 메모리 주소에서 오프셋을 분리하는 것입니다. 제가 진행하는 절차는 다음과 같습니다.
- 뒤에 여는 괄호가 오는 모든 숫자를 찾으십시오. 이는 내 다른 데이터에 함부로 다루면 안 되는 대괄호가 포함될 수 있기 때문입니다.
- 대괄호를 공백으로 바꾸십시오.
- 닫는 괄호가 뒤에 오는 모든 숫자를 찾아 닫는 괄호만 공백으로 바꿉니다.
괄호는 다음 두 명령을 사용하여 쉽게 처리할 수 있습니다.
sed 's/\[/ /' #replace the opening bracket with a single space.
sed 's/\]//' #delete the closing bracket
하지만 다시 말하지만, 데이터베이스에 저장된 다른 데이터를 엉망으로 만들고 싶지 않습니다.
두 번째 추측은 역참조를 사용하여 작업을 처리하는 것입니다. sed
각 숫자 뒤에 여는 중괄호와 해당 숫자를 역참조하고 그 뒤에 공백을 추가하는 것이 가능합니까 ? 결과는 다음과 같습니다.
0x2322AD4 3]
그러면 위에서 언급한 두 번째 명령을 사용하여 닫는 중괄호를 제거할 수 있습니까?
문제를 해결하는 완전히 다른 방법이 있다면 게시해 주세요.
답변1
내 생각에 당신이 찾고 있는 것은 이것이다:
sed -r 's/(0[xX][[:xdigit:]]+)\[([[:digit:]]+)\]/\1 \2/g'
예를 들어:
$ sed -r 's/(0[xX][[:xdigit:]]+)\[([[:digit:]]+)\]/\1 \2/g' <<EOF
> mem+offset: 0x2322AD4[3] 0x232BEEF[12]
> unchanged: 0x22343AF word[2] 7E[word]
> EOF
mem+offset: 0x2322AD4 3 0x232BEEF 12
unchanged: 0x22343AF word[2] 7E[word]
$
참고: 0[xX]가 없으면 두 번째 입력 라인에서 d[2]를 교체할 수 있는 것으로 간주됩니다.
답변2
나는 그것을 알아낼 수 있습니다. 향후 액세스에 관한 이 질문에 대한 답변은 다음과 같습니다.
sed -r 's/(0[Xx][A-Fa-f0-9]+)\[([0-9]+)\]/\1 \2/g'