sed를 사용하여 /가 포함된 정확한 문자열을 검색하려고 합니다. 아래는 내가 시도하고 있지만 행운이 없습니다.
input_string="/path /path1 /path2"
search_string="/path"
input_string=echo $input_string | sed "s#\b$search_string\b##g"
그러나 이러한 일련의 명령을 실행할 때 "/path1 /path2" 대신 "/path /path1 /path2" 값을 포함하기 위해 여전히 input_string을 사용합니다.
나도 시도해봤는데 input_string=echo $input_string | sed "s#\<$search_string\>##g"
운이 없네
저는 RHEL6.5를 사용하고 있으며 셸에서 이 명령을 실행하고 있습니다.
답변1
여기서 문제는 /
모드에 있습니다 $search_string
.
/
영숫자가 아니므 로 "단어"로 간주되지 않습니다. 이는 패턴 앞에 단어 경계가 없기 때문에 패턴이 \</path\>
일치하지 않음 을 의미합니다 ./path
/
검색 문자열을 /path\>
(예: s##$search_string\>##g
)로 변경하거나 를 사용하거나 /path[^0-9]
, 이러한 특정 입력 데이터 및 검색 문자열의 경우 간단히 s#$search_string ##g
대체하여 사용할 수 있습니다.
답변2
짧은 답변
원하는 것을 얻으려면 다음 명령을 사용하십시오.
input_string=$(echo $input_string | sed "s#$search_string\b##g")
긴 대답
왜 sed
교체하지 않습니까?
\b
단어 경계를 나타냅니다. 정의는 다음과 같습니다.
메타 문자 \b는 캐럿 및 달러 기호와 마찬가지로 앵커입니다. "단어 경계"라는 위치에서 일치합니다. 이 일치 기간은 0입니다.
세 가지 다른 위치가 단어 경계 역할을 할 수 있습니다.
- 첫 번째 문자가 단어 문자인 경우 문자열의 첫 번째 문자 앞입니다.
- 문자열의 마지막 문자 뒤, 마지막 문자가 단어 문자인 경우.
- 문자열의 두 문자 사이. 그 중 하나는 단어 문자이고 다른 하나는 단어 문자가 아닙니다.
그것을 발견여기. 따라서 첫 번째 문자 는 a 이고 search_string
첫 번째 규칙으로 인해 /
단어 경계를 찾을 수 없는 것 같습니다(단어 문자가 아니기 때문에) .sed
/
결과가 저장되지 않는 이유는 무엇입니까?input_string
echo
먼저 두 명령( 및 sed
)을 모두 실행한 다음 결과를 변수에 저장 해야 합니다 input_string
. 이렇게 하려면 이 두 명령을 에 넣으십시오 $()
. 이렇게 하면 해당 명령이 실행되고 결과가 변수에 반환됩니다(참조).짧은 답변).
나는 이것이 완전한 대답이 아니라는 것을 알고 있지만 그것이 내가 얻은 전부입니다.
답변3
정확한 단어 일치는 sed
까다롭습니다. 특히 이식 가능한 솔루션을 작성하려고 하거나 "단어" 정의에 _
(귀하의 경우와 같이) 이외의 특수 문자가 포함된 경우에는 더욱 그렇습니다. 내가 찾은 가장 좋은 방법은 입력 줄에 단어가 나타날 수 있는 4가지 상황을 모두 고려하는 것입니다.
- 처음에
- 마지막에
- 시작과 끝(전체 라인을 차지함)
- 중간 어딘가
단어 정의가 공백이 아닌 일련의 문자인 경우 다음 솔루션이 적합합니다(테스트됨).
_s='[ ]' # contains a space and a literal tab character (CTRL-V + TAB) input_string=`echo "$input_string" | sed \ -e "s|^$search_string\\($_s\\)|\\1|g" \ -e "s|\\($_s\\)$search_string$|\\1|g" \ -e "s|^$search_string$||g" \ -e "s|\\($_s\\)$search_string\\($_s\\)|\\1\\2|g"`
|
. 대신 구분 기호로 선택했습니다 . 이는 파일 이름에 나타날 수 있기 #
때문입니다 (예:#
Emacs는 자동으로 파일을 저장합니다.) |
적어도 Linux에서는 예약되어 있습니다. 또한 출력에는 각 인스턴스 주위에 공백 문자가 포함됩니다 $search_string
. 공백을 생략하려면 다음을 사용할 수 있습니다(테스트됨).
_s='[ ]' # contains a space and a literal tab character (CTRL-V + TAB) input_string=`echo "$input_string" | sed \ -e "s|^$_s*$search_string$_s\\{1,\\}||g" \ -e "s|$_s\\{1,\\}$search_string$_s*$||g" \ -e "s|^$search_string$||g" \ -e "s|\\($_s\\)$search_string$_s\\{1,\\}|\\1|g"`
$search_string
마지막 표현식은 약간 다르게 보입니다. 입력 줄을 처리하는 이 지점에 도달하면 양쪽의 공백을 제거하고 싶지 않을 것입니다. 그렇게 하면 공백이 제거되기 때문입니다. 어느 쪽에도 일치하지 않는 단어 사이에 $search_string
이렇게 하면 서로 붙게 됩니다.
최종 참고사항:
g
표현식 에서 일부 수정자를 생략할 수 있지만sed
이를 유지해도 아무런 문제가 없습니다.- 이것은 말할 것도 없이 당연한 일이지만
$search_string
경로인 경우에는 공백을 포함할 수 없습니다.