Shell脚本:在文本中间(有时在开头)抓取字符串


9

我有一个很大的文本文件,其中的一部分看起来像这样(编辑后的值):

JULIANA XXXX006060 LI1033322 THC BRL 730.00
XXXX006296 AA1004737 THC BRL 1,740.00
SANTOS JULIANA XXXX006668 AA1004786 THC BRL 8,150.00
SANTOS JULIANA CABINDA XXXX006697 AA1004777 THC BRL 2,325.00
SANTOS JULIANA XXXX006699 AA1004790 THC BRL 2,325.00
JULIANA BATA XXXX006141 CCC012946 THC BRL 1,460.00
JULIANA BATA XXXX006153 CCC013054 THC BRL 870.00
JULIANA XXXX006269 CCC013105 THC BRL 870.00
JULIANA XXXX006295 CCC013083 THC BRL 870.00
JULIANA BATA XXXX006305 CCC013043 THC BRL 1,460.00

我总是想(用cutawk或其他东西)抓取以开头的字符串XXXX00,但永远不要在相同的字段号中。

如何在shell脚本中做到这一点?

Answers:


12

只是grep它:

grep -oE 'XXXX00[0-9]*' file
  • -o:仅打印匹配的部分。
  • -E:激活扩展的正则表达式。
  • [0-9]*:要搜索的字符串后,仅应显示数字。

请注意,正则表达式不需要该-E选项(尽管它没有害处)。
乔纳森·勒夫勒


3

grep与PCRE一起使用:

% grep -Po '(^|\s)\KXXXX00[^\s]*(?=(\s|$))' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

-w在这种情况下,您可以不用(word),请注意,单词构成字符被视为[[:alnum:]_]

% grep -wo 'XXXX00[^ ]*' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

2

其他几种方式

使用GNU awk

awk -vRS='[[:space:]]+' '/^X{4}0{2}/' file

对于较旧的GNU版本awk--re-interval可能需要这样做,因此

awk --re-interval -vRS='[[:space:]]+' '/^X{4}0{2}/' file

trgrep

<file tr -s '[:space:]' '[\n*]' | grep '^X\{4\}0\{2\}'

1
sed 's/[^0]*  *\([^ ]*\).*/\1/' <in >out

字段的数量似乎有所不同,因为您那里有一个人员列表,而且他们的姓名数量不同。但可能没有一个名称带有0的名称,因此,请完全切掉第一个以空格分隔的字符串,并保存其中的所有内容,然后剪切所有后面的内容。

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.