如何在文件中的双引号内提取单词? e.g。
variable "xxx"
答案 0 :(得分:2)
将文本文件读入Tcl就是这样:
set fd [open $filename]
set data [read $fd] ;# Now $data is the entire contents of the file
close $fd
要获取第一个引用的字符串(在某些假设下,特别是在双引号内缺少反向双引号字符),请使用:
if {[regexp {"([^""]*)"} $data -> substring]} {
# We found one, it's now in $substring
}
(括号中的引号加倍是完全没必要的 - 只需要一个 - 但它确实意味着荧光笔在这里做正确的事。)
查找所有引用字符串的最简单方法是:
foreach {- substring} [regexp -inline -all {"([^""]*)"} $data] {
# One of the substrings is $substring at this point
}
请注意,我在每种情况下都使用相同的正则表达式。实际上,将这些RE(尤其是重复使用的)计算到自己的变量中是一种很好的做法,这样你就可以“命名”它们。
结合上述所有内容:
set FindQuoted {"([^""]*)"}
set fd [open $filename]
foreach {- substring} [regexp -inline -all $FindQuoted [read $fd]] {
puts "I have found $substring for you"
}
close $fd
答案 1 :(得分:0)
如果您只是在寻找正则表达式,那么您可以使用TCL的捕获组。例如:
set string {variable "xxx"}
regexp {"(.*)"} $string match group1
puts $group1
这将返回xxx
,丢弃引号。
如果要匹配文件中的数据而不必直接将文件读入TCL,也可以这样做。例如:
set match [exec sed {s/^variable "\(...\)"/\1/} /tmp/foo]
这将调用sed来查找所需匹配的部分,并将它们分配给TCL变量以进行进一步处理。在此示例中, match 变量如上所述设置为xxx
,但是在外部文件而不是存储的字符串上运行。
答案 2 :(得分:-1)
如果您只想在grep
中找到文件中引号中的所有单词并对单词执行某些操作,则可以执行以下操作(在shell中):
grep -o '"[^"]*"' | while read word
do
# do something with $word
echo extracted: $word
done