在前两个匹配项之间逐行搜索文本

在前两个匹配项之间逐行搜索文本

我有包含文本的文件:

1861_ASSET-D_T_201702181000-201702181045_HN_
197895_STRING-H_T_201702181000-201702181045_HN_
14512861_FILE-FD_T_201702181000-201702181045_HN

如何使用 egrep、awk 或 sed 在第一个和第二个匹配“_”之间分配文本?

我希望有:

ASSET-D
STRING-H
FILE-FD

答案1

$ sed -r 's/[^_]+_([^_]+)_.*/\1/' file
ASSET-D
STRING-H
FILE-FD

解释

  • -r使用 ERE
  • s/old/new/old用。。。来代替new
  • [^_]+一些非下划线的字符
  • (some chars)留着some chars以后用
  • .*任意数量的任意字符
  • \1已保存的模式

答案2

您可以使用awk以下参数:

  • -F "_" - 用作_分隔符
  • '{print $2}'- 打印第二个元素

    $ awk -F  "_" '{print $2}' input_file
    ASSET-D
    STRING-H
    FILE-FD
    

答案3

如果您想允许其他工具,cut最简单的解决方案是:

cut -d _ -f 2 < input.txt > output.txt

答案4

用python单行代码来说:

python3 -c "[print(l.split('_')[1]) for l in open('f')]"

'f'您的文件在哪里,用引号括起来,例如:

python3 -c "[print(l.split('_')[1]) for l in open('/home/jacob/blub')]"

ASSET-D
STRING-H
FILE-FD

解释

for l in open('f')

读 f每行, 和

l.split('_')[1]

按分隔符 分割行_,保留第二个字符串(索引[1],其中[0]是第一个。

print(l.split('_')[1]) 

随后打印找到的字符串。

相关内容