sed 또는 awk를 사용하여 패턴 뒤의 모든 내용을 삭제하세요.

sed 또는 awk를 사용하여 패턴 뒤의 모든 내용을 삭제하세요.

나는 그것에 대해 많은 질문이 있다는 것을 알고 있지만 그것을 작동시킬 수는 없습니다.

그룹(예: )을 사용하거나 삭제하고 싶습니다 root. 그래서 나중에 다 삭제해야 해요/etc/groupsedawkroot:*:0:

나는 다음을 사용하여 그것을 제거하려고 시도했습니다.

cat /etc/group | awk '!p;/^root:*:0:/{p=1}'

그리고

cat /etc/group | sed 's/root\:\*\:0\:.*//'

그러나 sed전체 root줄을 삭제하십시오.

내가 뭘 잘못했나요?

답변1

sed와 함께 주소를 사용하여 작업할 라인을 제한할 수 있습니다.

 sed '/^root:/s/:[^:]*$/:/' /etc/group

로 시작하는 줄의 경우 root:줄의 마지막 문자 이후의 모든 문자가 삭제됩니다 :.

( /etc/group레코드에는 :구분 열이 4개만 있으므로 마지막 열과 그 안의 모든 그룹 구성원이 제거됩니다.)

답변2

그리고 awk:

awk 'BEGIN{OFS=FS=":"} $1=="root"{$NF=""} 1' /etc/group

필드를 분할하고 :첫 번째 필드가 인 경우 마지막 필드를 빈 문자열로 설정합니다 root.

답변3

이것이 실제로 간단한 텍스트 처리 도구를 사용하여 수행되어야 하는지에 대한 질문과는 별개로, sed"replace" 명령이 다음을 대체하기 때문에 호출하면 전체 줄이 지워집니다.전체대체 패턴을 찾습니다(귀하의 경우 빈 문자열).

라인 작업을 위한 최소한의 수정 sed은 다음과 같습니다.

sed 's/root:\*:0:.*/root:*:0:/' /etc/group

또는 캡처 그룹을 사용하십시오.

sed 's/\(root:\*:0:\).*/\1/' /etc/group

(그런데 cat이는 파일을 명령줄 인수로 제공하거나 사용하는 경우에는 필요하지 않습니다.)sedawk

그러나 @Shawn이 제안한 솔루션은 이와 관련하여 더 우아합니다.

관련 정보