sed를 사용하여 문자열 주위에 여는 대괄호와 닫는 대괄호를 모두 제거


18

우분투 12.04.1 LTS의 bash 쉘 에서이 명령을 실행하고 있습니다. 한 번에 []문자를 모두 제거하려고합니다 . 즉 두 번째로 sed로 파이프하지 않아도됩니다.

대괄호는 정규 표현식에서 특별한 의미가 있으므로 백 슬래시를 앞에 붙여서 대괄호를 피하고 있습니다. 내가 기대했던 결과는 단지 문자열 123이지만 대괄호는 남아 있으며 이유를 알고 싶습니다!

~$ echo '[123]' | sed 's/[\[\]]//'
[123]

내가 궁극적으로 달성하려는 것은 내 bash 스크립트의 다른 곳에서 사용할 수 있도록 대괄호 사이에 bash 변수를 할당하는 것입니다. .
Xhantar

2
코멘트로 추가하기 : bash의 PE 기능을 다음과 같이 사용할 수 있습니다. str='[123]'; str1=${str/\[/}; str2=${str1/\]}; echo $str2
Valentin Bajrami

1
@ val0x00ff-순수 bash 대체 .. 감사합니다! :) 새로운 것을 배웠다.
Xhantar

답변:


24

설명서를 주의 깊게 따르면 쉽습니다 . 문자 클래스 내의 모든 멤버는 특별한 의미를 잃습니다 (몇 가지 예외는 제외). 그리고]가 목록에서 첫 번째 로 배치되면 특별한 의미를 잃습니다 . 시험:

$ echo '[123]' | sed 's/[][]//g'
123
$

이것은 말합니다 :

  1. 공진 영역 외측 [괄호, 즉 포함되는 문자 중 어느 대체 :
    • ]
    • [
  2. 빈 문자열로 대체하십시오. 따라서 빈 대체 문자열 //,
  3. 교체 사방 ( 세계적으로 ) - 따라서 최종 g.

다시 ] 해야한다 가 포함 될 때마다 클래스에 첫번째로 올려주세요.


11

왜 작동하지 않는지 잘 모르겠지만 다음과 같이 작동합니다.

echo '[123]' | sed 's/\(\[\|\]\)//g'

아니면 이거:

echo '[123]' | sed -r 's/(\[|\])//g'

다른 접근 방식을 시도하고 대괄호 안의 문자열을 일치시킬 수 있습니다 (문자열을 쉽게 일치시킬 수 있고 대괄호로 정의하지 않은 경우).

echo '[123]' | egrep -o "[0-9]+"

원래 정규식과 동일한 문제가 발생하여 grep이것이 단순한 문제가 아니라고 sed생각합니다.

이상하게도 이들은 서로 다른 결과를 생성하지만 그 중 하나는 원하는 결과와 일치합니다.

echo '[123]' | egrep -o '[^][]+'
123

echo '[123]' | egrep -o '[^[]]+'
3]

이것을 원본에 적용 sed하고 /g수정자를 추가하여 괄호를 모두 제거하십시오 .

echo '[123]' | sed 's/[][]//g'
123

세 번째 접근 방식 (예 : -o ...)은 내 문제에 대한 가장 깨끗한 해결책처럼 보입니다. 나는 대괄호 사이에 정수 만 가질 것입니다 (죄송합니다. 제 질문에 언급해야합니다). 나는 이상한 점에 빠지지 않아야합니다. 감사!
Xhantar

3
당신은 또한 사용할 수 있습니다 tr: echo '[123]' | tr -d '[]'-탈출에 대한 정규 표현식 혼란을 피하십시오.
James O'Gorman

@ James O'Gorman-흥미 롭습니다. 어떤 이유로 나는 tr한 번에 하나의 문자를 번역 할 수 있다고 생각 했지만 잘못되었습니다. 감사!
Xhantar

4

괄호 앞뒤에있는 모든 것을 제거하려면 :

$ echo '[123]' | sed 's/.*\[//;s/\].*//;'
123

데이터가 이와 같으면 항상 대괄호로 시작하고 끝나는 것을 의미합니다.

$ echo '[123]' | sed 's/.//;s/.$//;'
123

내가 작업하고있는 데이터는 항상 대괄호로 시작하고 끝납니다. 여전히 내 솔루션이 작동하지 않는 이유를 알고 싶습니다. 어떤 아이디어? 그리고 2x 정규 표현식을 지정하지 않고 이것을 수행하는 방법이 있습니까?
Xhantar

1
@Guru이 솔루션은 저에게서 효과가 있었으며 Xhantar는 매우 늦은 답변이지만 tldp.org의 코드 및 Bash Beginners 안내서에서 볼 수있는 것은 여러 번 검색하고 교체하려고했습니다. '['와 다른 하나는 ']'가 작동하지 않습니다. 두 개의 서로 다른 검색 간격을두고 ";" 또는 -e 옵션. 's / <search> / <replace> / g; s / <search> / <replace> / g 'OR sed -e's / <search> / <replace> / g '-e's / <search> / <replace> / g '
ArunMKumar

1

'abcdef [123] ghijk'와 같이보다 복잡한 문자열이있는 경우 내부 bash 명령 'cut'을 사용하여 대괄호 사이에만 텍스트를 추출 할 수도 있습니다.

$ echo 'abcdef[123]ghijk' | cut -d '[' -f 2 | cut -d ']' -f 1
123

1

을 사용하여 여는 브래킷을 벗어날 수 있습니다 \[. 닫는 괄호에는을 사용하십시오 []].

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.