按空格定界,但忽略反斜杠空格


8
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

\总是被当作转义字符还是只是\ 特殊的?例如,是 a\\ b一两个字段?
格雷戈里·尼斯贝特

我输入的@GregoryNisbet是转义字符,而不是真实数据
GypsyCosmonaut

1
如果您的数据碰巧包含真实的反斜杠,将如何表示?
格雷戈里·尼斯贝

@GregoryNisbet好问题。因为我只替换[[:space:]]\[[:space:]],所以原始数据\保持不变。在第一列中得到的原始数据仅由空格而不是空格分隔之后\[[:space:]],我将替换\[[:space:]][[:space:]],然后再次将原始数据放回带有\的位置。
GypsyCosmonaut

Answers:


9

通过gnu awk(gawk),您可以使用一些零长度断言,例如\<\>

$ 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,

5

您可以将\ space替换为其他内容,然后再返回。

sed 's/\\ /\\x20/g' data_file | awk '{ print $1; }' | sed 's/\\x20/\\ /g'

仅使用sed:sed's / \\ / \\ x20 / g; s
/。*

或者,awk,使用默认的SUBSEP变量值\034awk '{gsub(/\\ /,SUBSEP,$0); val=$1; gsub(SUBSEP,"\\ ",val); print val}' file
glenn jackman

5

与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,})?:使用时这是可选的(...)?; 我们也可以改用([^\]*\\ ){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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.