2016-10-01 1 views
2

REGEXP sed에 ^|.과 같은 것을 포함하는 대체를 수행하면 첫 번째 문자가 일치하는 경우 패턴 공간의 시작 부분에서 null 문자열과 일치하지 않습니다. 또한 마지막 문자가 일치하면 끝과 일치하지 않습니다. 왜 그런가요? 여기

입력으로합니다 ( -r 옵션) 123 사용하여 몇 가지 예입니다 : \` 대신 ^으로 사용하는 경우
substitution expected output  actual output comments 
s/^/x/g   x123    x123   works as expected 
s/$/x/g   123x    123x   works as expected 
s/^|$/x/g  x123x    x123x   works as expected 
s/^|./x/g  xxxx    xxx    didn't match the very begining 
s/.|$/x/g  xxxx    xxx    didn't match the very end 
s/^|1/x/g  xx23    x23    didn't match the very begining 
s/^|2/x/g  x1x3    x1x3   this time it did match the begining 

내가 같은 결과를 얻을 수 있습니다.
나는 GNU 나오지 버전 4.2.1과 4.2.2

AFAIK 교대에서 가장 긴 일치 일치하도록 노력할 것 나오지

Try it online!

답변

4

을 시도했습니다.

따라서 패턴 공간의 시작 부분에있는 null 문자열과 동일한 위치의 1을 비교할 수 있습니다. 1이 가장 길게 선택됩니다.

는 다음 생각해 끝에 도달 할 때

$ sed 's/12\|123/x/g' <<< 123 
x 
$ sed 's/123\|12/x/g' <<< 123 
x 
$ sed 's/^1\|12/x/g' <<< 123 
x3 

동일하게 적용됩니다. sed 's/.\|$/x/g' <<< 123 휴식을 허용합니다 :

123 
^ 
. matches and replace with x 
x23 
^ 
. matches and replace with x 
xx3 
^
    . matches and replace with x 
xxx 
^
    Out of pattern space $ will not match. 
+0

그래서 처음에는 null 문자열을 자신의 위치로 취급하지 않습니까? 어떤면에서는 첫 번째 캐릭터의 일부입니까? – Riley

+0

'^'는 널 문자열과 일치하고, 일치 길이는 0이며 첫 번째 위치의 '1'은 길이가 1입니다. 따라서이 문자열은 바뀝니다. 둘 다 일치하지만 가장 긴 것만 대체됩니다. – andlrc

+0

둘 다 대체되지 않는 이유는 무엇입니까? ''123 '이 더 길더라도'sed '/ 12 \ | 123/x/g <<< 12123'는'12'와'123'을 대체합니다. – Riley