공백으로 구분하되 백슬래시 공백은 무시합니다.

공백으로 구분하되 백슬래시 공백은 무시합니다.
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

perlpcre그러나 불행하게도 또는 (예 (?<!\\): , (?<=\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

관련 정보