다음 예제 파일에서는 단어가 포함된 줄을 제외하고 fstab
로 시작하는 모든 줄을 제거하려고 합니다 UUID
.UUID
boot
/dev/mapper/VG100-lv_root / xfs defaults 0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot xfs defaults 0 0
/dev/mapper/VG100-lv_var /var xfs defaults 0 0
UUID=0b14011d-f69d-4c4c-8ce0-6240bb0a574a /var/kafka/mp1 xfs defaults,noatime 0 0
UUID=2d7872f2-96d4-4ba9-8a17-a1115542645c /var/kafka/mp2 xfs defaults,noatime 0 0
UUID=79bdbf56-9a09-4505-ab8e-41ce9432cf0f /var/kafka/mp3 xfs defaults,noatime 0 0
UUID=ca42a388-83d4-4f8b-aff7-3450d836eef7 /var/kafka/mp4 xfs defaults,noatime 0 0
UUID=62d356bb-c393-4a74-bbf9-984b60d3b5c4 /var/kafka/mp5 xfs defaults,noatime 0 0
UUID=d4071a83-204f-475f-8917-cdd77ef6b1ed /var/kafka/mp6 xfs defaults,noatime 0 0
따라서 예외의 결과는 다음과 같아야 합니다.
/dev/mapper/VG100-lv_root / xfs defaults 0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot xfs defaults 0 0
/dev/mapper/VG100-lv_var /var xfs defaults 0 0
지금까지 우리는 다음과 같은 sed를 가지고 있습니다
sed -i '/^UUID/d' /etc/fstab
UUID
그러나 위의 방법은 모든 행을 삭제합니다
답변1
UUID=
첫 번째 필드가 로 시작 하고 두 번째 필드가 그렇지 않은 행을 삭제하려는 것 같습니다 /boot
.
따라서 awk
Perl의 awk 모드는 확실한 선택처럼 보입니다.
awk '! ($1 ~ /^UUID=/ && $2 != "/boot")' /etc/fstab
(GNU awk는 내부 편집에 사용될 수 있습니다 -i /usr/share/awk/inplace.awk
).
perl -lae 'print unless $F[0] =~ /^UUID=/ && $F[1] ne "/boot"' /etc/fstab
( 내부 편집 perl
용 ).-i
다음을 사용하여 동일한 작업을 수행할 수 있습니다 sed
.
sed '/^[[:space:]]*[^[:space:]]\{1,\}[[:space:]]\{1,\}/boot\([[:space:]].*\)\{0,1\}$/b
/^[[:space:]]*UUID=/d' /etc/fstab
일부는 (most) 또는 (Macos를 포함한 FreeBSD 및 그 파생물)을 사용하여 sed
그 자리에서 편집 할 수 있습니다.-i
-i ''
^사용하지 마세요-i inplace
현재 작업 디렉터리(as or)에서 확장 기능을 먼저 gawk
로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
답변2
먼저 sed에게 포함된 행을 인쇄하도록 지시 한 다음 구분 기호 표현식을 사용하여 boot
포함된 행을 삭제하도록 지시합니다.UUID
;
sed -i '/boot/p;/UUID/d' /etc/fstab
인쇄 표현식이 삭제 표현식 앞에 주어지기 때문에 boot가 포함된 행은 UUID가 있는 행이 삭제되기 전에 인쇄됩니다. 이는 표현식 위치를 변경하려는 경우 작동하지 않습니다.
당신이 준 예를 감안할 때 다음과 같은 것을 얻어야합니다
/dev/mapper/VG100-lv_root / xfs defaults 0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot xfs defaults 0 0
/dev/mapper/VG100-lv_var /var xfs defaults 0 0
^
빈 줄을 제거하고, 줄의 시작을 표시하고, $
줄의 끝을 표시하는 섹션을 추가할 수도 있으므로 , $
줄의 시작 뒤에 줄의 끝이 있는 줄을 제거하는 표현식을 추가하세요 ^
.
sed -i '/boot/p;/UUID/d;/^$/d' /etc/fstab
편집하다
Stéphane Chazelas가 주석에서 지적했듯이 UUID가 같은 줄에 포함되지 않은 경우 boot가 포함된 줄이 두 번 인쇄되므로 이와 같은 것이 더 좋을 것입니다.
sed -i '/^UUID/{/boot/!d};/^$/d' /etc/fstab
/boot가 포함되어 있지 않으면 UUID로 시작하는 줄을 삭제한 다음 빈 줄을 삭제합니다.
답변3
많은 가능성이 있습니다. 간단하게 유지하려면 다음을 사용할 수 있습니다.
'/^UUID/{
/\/boot/b
d
}'
{}
패턴이 일치할 때 실행할 추가 명령을 포함하는 데 사용됩니다 . 부팅이 일치하면 b
명령 끝으로 분기하고, 그렇지 않으면 완료합니다 d
. 또는,
'/^UUID/{
/\/boot/!d
}'
시동이 걸린 경우아니요일치하고 삭제합니다. 이러한 패턴은 공백 일치를 통해 향상되어야 하지만 파일에서 예상되는 내용을 이해한다면 아마도 신경 쓰지 않을 것입니다.
한 줄 버전은 일부 버전에서 작동하지 않을 수 있습니다 sed
.
'/^UUID/{/\/boot/b;d;}'
그리고
'/^UUID/{/\/boot/!d;}'
답변4
그리고진주:
perl -i -pe 's@^UUID\S+\s++(?!/boot).*\n@@' /etc/fstab
비슷 -i
하다 sed
,대기줄
정규식 일치는 다음과 같습니다.
마디 | 설명하다 |
---|---|
^ |
문자열의 시작 |
UUID |
'UUID' |
\S+ |
공백이 아닌 문자(\n, \r, \t, \f 및 " "를 제외한 모든 문자)(1회 이상(최대한 많이 일치)) |
\s++ |
공백(\n, \r, \t, \f 및 " ")은 1회 이상 일치하며 아무것도 반환하지 않습니다. |
(?! |
시야다음이 있는지 확인하세요. |
/boot |
'/시작' |
) |
미리보기 끝 |
.* |
\n을 제외한 모든 문자(0회 이상(최대한 많이 일치)) |
\n |
'\n'(개행 문자) |