awk在特殊字符之间获取特定单词

时间:2019-08-08 05:36:16

标签: shell awk

我需要一些帮助。 我有这个 info.txt

  [hello] 
    test world
  { gg[tester]
    }

我如何输出到这个,剩下的唯一字符串在文件的第一个字符串括号内?

   hello

我当前的命令是这个

  awk '{ gsub("[]].*",""); print $0 }' info.txt

输出为

  [hello
  { gg
    }

5 个答案:

答案 0 :(得分:1)

gawk ' match($0, /\[(.*)\]/, str) { print str[1]; exit; }' info.txt

gawk特定。

更新:

awk

这只会打印第一次出现的情况。

awk 'match($0, /\[(.*)\]/) { print substr($0, RSTART+1, RLENGTH-2) ; exit}' info.txt

awk '{ if( NR == 1 && match($0, /\[(.*)\]/)) { print substr($0, RSTART+1, RLENGTH-2)}}' info.txt

如果仅用于第一行:

import glob
import errno
import xml.etree.ElementTree as ET
from xml.dom import minidom
path = 'C:\\Users\\abbas\\IU xrays reports\\*.xml'
files = glob.glob(path)
loops=0
for name in files:
    try:
        with open(name) as f:

            tree = ET.ElementTree(file=f)
            root = tree.getroot()
            for chld in root:
                if(chld.tag=='parentImage'):
                    img = chld.get('id')
                    img = (img + '.png')
                    loops += 1
                    print(img)


    except IOError as exc:
        if exc.errno != errno.EISDIR:
            raise

答案 1 :(得分:1)

您的gsub是错误的;如您所见,它只删除了右方括号。

如果只希望第一个匹配项,只需在打印后退出即可。

awk '{ gsub("[][]",""); print; exit }' info.txt

print的默认参数为$0,因此您不必将其拼写出来。

字符类内部的方括号本身是用方括号写的,这很棘手。作为一种特殊情况,如果类中的第一个字符为],则它不被视为类的结尾括号,而是被视为类中字符列表的成员。

答案 2 :(得分:1)

这有效:

awk '/^\[/ {sub(/\[/, "");sub(/\].*/,"");print}'

假定这些行没有前导空格。

您不需要gsub(),因为该行上只有一个匹配项。

您可以使用单个gensub(),sed或什至更好的perl来完成此操作,但这些替代方法可能不可用。

答案 3 :(得分:1)

由于以下错误,您没有收到预期的结果:

  1. 在解析之前,您应该过滤出与模式“用方括号括起来的字符序列”匹配的行。相反,您将awk表达式应用于文件中的所有行
  2. gsub("[]].*","")替换右方括号及其后面的所有内容,并使用一个空字符串。这可能是为了摆脱方括号。但是至少您忘记了方括号。
  3. 未进行任何操作以将解析限制为“第一个匹配项”。如前所述,处理完第一条匹配行后,您应该拥有exit

这是许多可能的解决方案之一:

awk -F'[][]' '/\[[^\[]+\]/ { print $2; exit }' info.txt

在上面的命令中,

  • -F字段分隔符指定为包含方括号的正则表达式;
  • /\[[^\[]+\]/是一个正则表达式,它匹配方括号中包含[以外的任何非空字符序列;正则表达式过滤从info.txt文件读取的行,以便仅将匹配的行传递到以下代码块;
  • print $2打印第二条记录,hello(第一条记录是第一个方括号之前的所有内容);
  • exit导致awk立即停止处理输入(以便仅处理第一个匹配项)。

答案 4 :(得分:0)

这可以做到:

awk -F"[][]" '{print $2;exit}' file
hello

它使用[]作为字段分隔符,然后打印第二个字段(括号之间的第一个字段)