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
) 您可以使用一些零长度断言,例如\<
或\>
:
$ 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
使用 GNUgrep
或兼容:
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,})?
:使用时这是可选的(...)?
;我们([^\]*\\ ){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