5678 []
testing,\ group []
[testing []
ip\ 5.6.7.8 []
launch-wizard-1 0.0.0.0/0
456dlkjfa []
1.2.3.4 []
test 1.2.3.4/32 4.3.2.0/23 4.3.2.0/23
default 4.3.2.0/23 4.3.2.0/23
launch-wizard-2 0.0.0.0/0
launch-wizard-3 0.0.0.0/0
2.3.4.5/32 []
위의 첫 번째 열을 얻고 싶지만 문제는 다음을 처리해야 한다는 것입니다.\
(백슬래시 공백)칼럼의 일부로 awk '{print $1}'
나에게 제공되어야합니다
5678
testing,\ group
[testing
ip\ 5.6.7.8
launch-wizard-1
456dlkjfa
1.2.3.4
test
default
launch-wizard-2
launch-wizard-3
2.3.4.5/32
답변1
gnu awk( )를 사용하면 또는 gawk
다음과 같은 길이가 0인 어설션을 사용할 수 있습니다 .\<
\>
$ echo 'a\ b c' | gawk 'BEGIN{FS="\\> +"} {print $1}'
a\ b
perl
pcre
그러나 불행하게도 또는 (예 (?<!\\)
: , (?<=\w)
등) 의 성숙한 항목은 아닙니다 .
$ echo 'a\ b, c' | perl -nle '@a=split /(?<!\\)\s+/, $_; print $a[0]'
a\ b,
답변2
\space를 다른 것으로 바꾸고 다시 돌아갈 수 있습니다.
sed 's/\\ /\\x20/g' data_file | awk '{ print $1; }' | sed 's/\\x20/\\ /g'
답변3
GNU grep
또는 호환 제품을 사용하세요.
grep -Po '^(\\.|\S)*'
또는 ERE를 사용하십시오.
grep -Eo '^(\\.|[^\[:space:]])*'
이는 \
공백을 구분 기호로 처리하고 자체를 구분 기호로 처리하는 인용 연산자로 처리됩니다. 즉, foo\\ bar
입력 시 를 반환합니다 foo\\
.
답변4
단지 sed
:
sed -r 's/^((([^\]*\\ ){1,})?[^ ]*).*/\1/' infile
또는 더 짧게:
sed -r 's/^(([^\]*\\ )*[^ ]*).*/\1/' infile
이는 (([^\]*\\ ){1,})?[^ ]*
다음과 일치합니다:
[^\]*\\
: 백슬래시가 아닌 모든 것, 백슬래시 다음에 공백이 오는 것으로 종료됩니다(\
내부 문자 클래스는 이스케이프할 필요가 없지만 외부 문자 클래스는 이스케이프할 필요가 있습니다).([^\]*\\ ){1,}
: 위 항목이 하나 이상 일치합니다.(([^\]*\\ ){1,})?
: 이것은 선택사항 이며 대신에 or를 사용할 수도(...)?
있습니다 .([^\]*\\ ){0,}
([^\]*\\ )*
((([^\]*\\ ){1,})?[^ ]*)
: 위의 항목과 일치하며 이는 선택 사항이며 공백이 아닌 모든 항목이\1
뒤따르고 역참조로 그룹으로 일치합니다.((([^\]*\\ ){1,})?[^ ]*).*
: 위와(...)
다른 항목과 일치합니다.*
.
그런 다음 교체 부품이 오면 \1
출력을 인쇄하십시오.
5678
testing,\ group
[testing
ip\ 5.6.7.8
launch-wizard-1
456dlkjfa
1.2.3.4
test
default
launch-wizard-2
launch-wizard-3
2.3.4.5/32