내 sed 명령은
sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'
그것은 돌아와야 한다,
bcde:cdeaf
(즉, 줄의 첫 번째 콜론 앞에 있는 모든 문자는 물론 콜론 자체도 제거해야 합니다.
그러나 그것은 아무것도 제거하지 않습니다.
내 혼란은 주로 다음과 같습니다.
1) 패턴 일치에 사용되는 대괄호는 sed 정규식 내에서 이스케이프되어야 합니까?
2) 두 경우 모두 (이스케이프 포함/이스케이프 없음) 작동하지 않습니다. 나는 노력했다.
sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'
답변1
d
의 명령은 sed
전체 줄을 삭제합니다. 여기서 사용되는 것은 s
(대체) 명령입니다.
$ echo 'abcd:bcde:cdeaf' | sed 's/[^:]*://'
bcde:cdeaf
[^:]
"콜론 아님"을 쓰는 방법입니다 . *
콜론이 아닌 표현 뒤에 오는 것은 "내 앞에 있는 모든 것"입니다(이 경우 콜론이 아님). 마지막으로 :
콜론을 선택합니다.
일치는 항상 왼쪽에서 오른쪽으로 탐욕적인 방식으로 발생하므로 주어진 문자열의 첫 번째 부분은 첫 번째 콜론까지 일치하는 것이 보장됩니다.
즉, 콜론과 첫 번째 콜론이 아닌 것을 원하는 만큼 선택하세요.
//
일치하는 하위 문자열을 아무것도 없는 것으로 바꾸는(즉, 제거하는) 메서드입니다.
답변2
열에 대해 작업하려면 다음이 있습니다 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 ;}