sed 역참조 사용

sed 역참조 사용

나는 메모리 주소 묶음을 나타내는 부호 없는 long 목록과 두 괄호 안의 오프셋(예: Mem[offset], 0x2322AD4[3]) 및 기타 데이터를 포함하는 데이터베이스를 가지고 있습니다. 내가 달성하고 싶은 것은 왼쪽 대괄호를 단일 공백으로 바꾸고 오른쪽 대괄호를 제거하여 메모리 주소에서 오프셋을 분리하는 것입니다. 제가 진행하는 절차는 다음과 같습니다.

  1. 뒤에 여는 괄호가 오는 모든 숫자를 찾으십시오. 이는 내 다른 데이터에 함부로 다루면 안 되는 대괄호가 포함될 수 있기 때문입니다.
  2. 대괄호를 공백으로 바꾸십시오.
  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'

관련 정보