2017-10-18 12 views
0

문제점 : 문자가있는 변수가 있습니다. 변수에 저장된 동일한 문자열 내에서 다른 문자를 앞에 추가하고 싶습니다.찾기 및 바꾸기 sed가있는 변수의 특정 문자

예. "[blahblahblah는]"---> "\ [blahblahblah \]"

현재 해결 방법 : 현재 내가 두 단계로 원하는 것을 달성, 각 단계는 하나 개의 브라켓

예를 공격.

temp=[blahblahblah] 
firstEscaped=$(echo $temp | sed s#'\['#'\\['#g) 
fullyEscaped=$(echo $firstEscaped | sed s#'\]'#'\\]'#g) 

이 나에게 내가 원하는 결과를 제공하지만 capturing groups를 사용하여 한 줄에서이 작업을 수행 할 수 같은 느낌. 나는 지금 막 운이 없 그리고 나는 밖으로 점화하고있다. 내가 뭘 하려는지 대신에 괄호로 묶어서 텍스트를 추출하기를 원한다는 사실을 모르는 대부분의 예가있다. This이 내 최신 시도입니다. 어떤 아이디어?

답변

3

이 더 효율적인 방법, (애호가 REG-전 만 1 s/s/r/),하지만이

\[blahblahblah\] 

fully=$(echo "$temp" | sed 's/\([[]\)/\\\1/;s/\([]]\)/\\\1/') ; echo "$fully" 

출력 샘플 입력 주어진 작품 수 sed 작업을 서로 연결하여 ; 또는 sed 스크립트 파일 인 경우 공백으로 구분하여 연결하는 것이 좋습니다.

\(...\) 쌍을 사용하는 sed 캡처 그룹에 대해 읽고 숫자로 참조하십시오 (예 : \1).

IHTH

2
$ temp=[blahblahblah]  
$ fully=$(echo "$temp" |sed 's/\[\|\]/\\&/g'); echo "$fully" 
\[blahblahblah\] 

간단한 설명,

  • \[\|\] '['또는 ']으로 대체 할 대상과 대 "[", "]'및 '|' 탈출해야합니다.
  • & : 일치하는 패턴을 나타내는 문자는 &이며, 이스케이프 처리해야한다는 것을 명심하십시오.

@Gordon 데이비슨의 제안으로, 당신은 또한 확장 된 형식의 정규식을 방지하기 위해 브래킷 식을 사용할 수 있습니다,

sed 's/[][]/\\&/g' 
+1

당신은 따옴표를 위해'$ temp'을 단어 분할 및 와일드 카드 확장을 방지 할 필요가있다. '[]'는 쉘 와일드 카드이므로 예기치 않게 확장 될 수 있습니다. –

+0

예, 당신 말이 맞아요. 이것은 OP에서 복사되고 이것을 수정할 것입니다. – CWLiu

+1

또한 정규 표현식이 확장 된 형식 (대안을 구분하기 위해'| '사용)으로 만 나타났습니다. 그것은'sed -r' (GNU sed) 또는'sed -E' (BSD sed)를 사용하지 않는 한 일반적으로 작동하지 않을 것입니다. 대괄호 표현식을 사용하는 것이 더 나을 것입니다 (대괄호를 포함하는 대괄호 표현식은 까다 롭습니다). 'sed 's/[] []/\\ &/g''가 작동해야합니다. –