sed를 사용하여 콜론이 처음 나타날 때까지 삭제


16

내 sed 명령은

 sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'

돌아와야합니다

bcde:cdeaf

(즉) 줄에서 첫 번째 콜론 앞의 모든 문자와 콜론 자체를 제거해야합니다.

그러나 이것은 아무것도 제거하지 않습니다.

나의 혼란은 주로

1) sed 정규식 내에서 패턴 일치에 대한 parens를 이스케이프해야합니까?

2) 두 경우 모두 (탈출 / 비 탈출) 작동하지 않습니다. 나는 시도했다

sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'
sed 

1
당신은 원합니다 sed 's/[^:]*://'. 그리고 당신은 d입력 줄을 올리지 않고 , s///ubstitution 명령 으로 입력 줄을 수정합니다 . 첫 번째 콜론 비트가 아닌 콜론 비트와 그 뒤에 오는 콜론을 대체해야합니다.
mikeserv

그것은 해결 ... 감사합니다, 남자 ... 이것은 sed 내부 정규식 패턴 일치를 배우기 위해 찍은 예제입니다 ... 그래서, 나는 parens와 그룹 / 패턴 일치를 사용하는 답변을 찾고 있습니다 ...

3
또는, 단지 bash는 사용 : printf "%s\n" "${line#*:}"...
jasonwryan

1
@ jasonwryan-예제 소스를 고려하여 좋은 지적. 그것을 처리하는 더 효율적인 방법입니다. 그것은 그러나 만약 while read line를 얻을 것을 $line, 아마 sed선호한다.
mikeserv

답변:


23
$ echo 'abcd:bcde:cdeaf' | sed 's/^[^:]*://g'
bcde:cdeaf

첫 번째 ^는 줄의 시작을 의미합니다. 은 [^:]내가 작성하는 방법을 알고 바로 유일한 방법입니다 하지 콜론 . 는 *콜론 뒤에 의미 바로 내 앞에 일의 수 (이 케이스하지-대장을). 마지막으로 :콜론을 선택합니다.

다시 말해, 줄의 시작, 콜론이 아닌 많은 수, 첫 번째 콜론을 선택하십시오.

//g수단은 모든 일치하는 인스턴스를 삭제합니다.


3
당신은 ^또한 global 플래그를 추가하기 때문에 경기 를 고정 시킬 필요가 없습니다 . 패턴의 첫 번째 발생은 한 번만 가능하므로 global 플래그는 고정하지 않은 [^:]*:것처럼 행에서 모든 패턴을 제거 하지 않습니다 ^. 정규 표현식을 서로 불균형하게 만드는 두 개의 불필요한 플래그로 복잡하게 만드는 대신, 그냥 내버려 둘 수 있습니다.이 답변의 편집 된 버전은 롤백하기 전에 설명했습니다. 왜 당신은 내가 모르는 나쁜 정보를 유포해야한다고 주장하지만, 이것은 나쁜 대답입니다.
mikeserv

@mikeserv는 이미 언급했듯이 이것을 지적 해 주셔서 감사합니다. sed기술 향상에 도움을 주셔서 감사합니다 . 나는 sed지금까지 내가 찾은 매우 제한적인 구문에서 벗어나는 것이 익숙하지 않습니다. 즉 sed, 내 대답은 OP의 문제가 최적 (즉, 귀하의) 대답이 아니지만 문제를 해결한다고 생각합니다. 이것은 Wikipedia가 아닌 Stack Exchange이므로 틀렸다면 수정하십시오.하지만 더 나은 답변을 알고 있다면 사람들이 다양한 접근 방식을보고 비교할 수 있도록 게시해야합니다. 편집 기능으로 답변을 답변으로 바꾸지 마십시오 .
user1717828

4
내 대답이 아니었다. 그것은 당신의 대답이었습니다. 그게 다야. 그리고 좋았습니다 . 더 이상 없습니다.
mikeserv

4

열로 작동하려면 다음이 있습니다 cut.

echo 'abcd:bcde:cdeaf' | cut -d: -f2-

똑같이

echo 'abcd:bcde:cdeaf' | cut -d: -f1 --complement

그리고 다른 버전 sed(빅 데이터의 경우 더 빠름) :

echo 'abcd:bcde:cdeaf' | sed 's/^://;t;s/:/\n:/;D'

오히려 이국 bash

echo 'abcd:bcde:cdeaf' | { IFS=: read -r first last ; echo "$last" ; }

또는

echo 'abcd:bcde:cdeaf' | { read -r line ; echo ${line#*:} ; }

또는

echo 'abcd:bcde:cdeaf' | { IFS=: read -a a ; printf '%b:' "${a[@]:1}\c" ; echo ;}

sed를 사용하여 적절한 방법을 추가 할 수도 있습니다.sed 's/[^:]*://'
don_crissti

@don_crissti 버전은 위의 답변에 나와 있습니다. 또한 정규 표현식 사용 으로 인해 각 줄에서 표현식을 컴파일해야하므로 속도가 느립니다.
Costas

아뇨. 위의 답변은 많은 시간을 허비하고 많은 다운 보트가 필요합니다. 특히 개정 사항과 의견을 읽으면 더욱 그렇습니다.
don_crissti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.