从文件中仅提取一部分数据

时间:2019-03-14 23:36:29

标签: bash sed grep

我的输入是test.txt,其中包含以下格式的数据:

'X'=>'ABCDEF',
'X'=>'XYZ',
'X'=>'GHIJKLMN',

我想得到类似的东西:

'ABCDEF',
'XYZ',
'GHIJKLMN',

我该如何在bash中解决这个问题?

谢谢!

4 个答案:

答案 0 :(得分:1)

如果输入中的“胖箭头”中从未包含字符>,则可以使用cut

cut -f2 -d\> file
  • -d指定分隔符,此处为>(防止外壳程序将其解释为重定向操作符所需的反斜杠)
  • -f指定要提取的字段

答案 1 :(得分:1)

这是使用sed的解决方案:

curl -sL https://git.io/fjeX4 | sed 's/^.*>//' 

Sed传递了一个命令:s ///。是一个正则表达式,它匹配从行(^)到最后一个'>'的任何字符(。*)。是一个空字符串,因此本质上sed只是删除了行中的所有字符,直到最后一个>。与其他解决方案一样,此解决方案假定行上只有一个'>'。

答案 2 :(得分:0)

如果数据确实是统一的,那么您可以运行cut(在example input上):

$ curl -sL https://git.io/fjeX4 | cut -d '>' -f 2
'ABCDEF',
'XYZ',
'GHIJKLMN',

您可以在explainshell上看到标志说明。

使用awk时,它看起来类似于:

$ curl -sL https://git.io/fjeX4 | awk -F '>' '{ print $2 }'
'ABCDEF',
'XYZ',
'GHIJKLMN',

答案 3 :(得分:0)

使用awk

awk 'BEGIN{FS="=>"}{print $2}' file
'ABCDEF',
'XYZ',
'GHIJKLMN',
awk中的

FS代表字段分隔符。 BEGIN中的代码仅在开始时执行,即在处理第一条记录之前执行。 $2打印第二个字段。

放置上述内容的一种更惯用的方式是

awk 'BEGIN{FS="=>"}$2' file
'ABCDEF',
'XYZ',
'GHIJKLMN',

awk中的默认操作是打印记录。在这里,我们明确提及要打印的内容。即$2