我需要一些帮助。 我有这个 info.txt
[hello]
test world
{ gg[tester]
}
我如何输出到这个,剩下的唯一字符串在文件的第一个字符串括号内?
hello
我当前的命令是这个
awk '{ gsub("[]].*",""); print $0 }' info.txt
输出为
[hello
{ gg
}
答案 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)
由于以下错误,您没有收到预期的结果:
gsub("[]].*","")
替换右方括号及其后面的所有内容,并使用一个空字符串。这可能是为了摆脱方括号。但是至少您忘记了方括号。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
它使用[]
作为字段分隔符,然后打印第二个字段(括号之间的第一个字段)