여러 개의 공백이 포함된 모든 열을 가져오시겠습니까?

여러 개의 공백이 포함된 모든 열을 가져오시겠습니까?

내 파일:

subnet 172.25.10.0 netmask 255.255.255.0 {
option domain-name-servers 172.25.10.9, 8.8.8.8;
default-lease-time 300;
max-lease-time 7500;
range dynamic-bootp 172.25.10.10 172.25.10.30 ;
option broadcast-address 172.25.10.255;
option routers 172.25.10.1;
option ip-forwarding off;
}

text part각 필드에 대해 별도의 개별 항목을 원합니다 value part. (필드를 모르고 각 필드에 공백이 몇 개 있는지 모릅니다. 값도 마찬가지입니다.)

우리가 알아차린 바와 같이:

필드:

max-lease-time;(o space)
option domain-name-servers (1 space)

값:

300(o space)

172.25.10.10 172.25.10.30 ( 1 space)

내가 원하는 출력은 다음과 같습니다.

필드 이름을 딴 변수에 값을 입력하고 싶습니다.

domain-name-servers="172.25.10.9, 8.8.8.8"(eliminate `option`)
default-lease-time="300"

등.

awk일부 값에는 공백이 있기 때문에 작동하지 않습니다.172.25.10.9, 8.8.8.8

내 목표를 달성하기 위해 사용할 수 있습니까 grep -o?

답변1

원본 텍스트에 존재하지 않는 grep을 사용하여 대체 할 수는 없다고 생각합니다 =. 그러나 grep 버전이 PCRE 확장을 지원한다고 가정하면 다음과 같이 이름-값 쌍을 분리할 수 있습니다.

grep -oP '(option |range )?\K(\S+) (.+?(?=;))'

교체하려면 일반 Perl을 대신 사용할 수 있습니다.

perl -pe 's/(option |range )?(\S+) (.+?);/$2="$3"/' file
subnet 172.25.10.0 netmask 255.255.255.0 {
domain-name-servers="172.25.10.9, 8.8.8.8"
default-lease-time="300"
max-lease-time="7500"
dynamic-bootp="172.25.10.10 172.25.10.30 "
broadcast-address="172.25.10.255"
routers="172.25.10.1"
ip-forwarding="off"
}

[시작 및 종료 줄을 무엇으로 하고 싶은지 지정하지 않았으므로 그대로 두겠습니다.]

또는 sed와 거의 동일합니다.

sed -E 's/(option |range )?([^[:space:]]{1,}) (.*);/\2="\3"/' file

둘 다 표현을 3으로 나눕니다.그룹각각에 의해

  • 단일 공백 으로 구성되거나 options뒤에 오는 선택적 문자열range
  • 비어 있지 않은 문자의 비어 있지 않은 시퀀스(뒤에 공백이 있음)
  • 0개 이상의 문자(다음에 ;)

=그런 다음 두 번째와 세 번째 그룹을 기호로만 바꾸고 큰따옴표를 추가합니다. 실제 애플리케이션에서는 [[:space:]]단일 공백을 길이가 0이 아닌 POSIX 문자 시퀀스(즉, 공백 및/또는 탭)로 바꾸는 등 이러한 표현식을 더욱 강력하게 만들어야 합니다 .

value모든 경우에 필드 만 공백을 포함할 수 있다고 가정합니다 . 필드 name(예: default-lease-time)는 공백이 아닌 문자로 구성되는 것으로 가정됩니다. 나는 그렇게 생각하지 않는다어휘상황을 처리하는 방법둘 다필드에는 따옴표가 없는 공백이 포함될 수 있습니다.

관련 정보