Grep双引号内的单词

时间:2012-06-19 02:28:41

标签: tcl

如何在文件中的双引号内提取单词? e.g。

variable "xxx"

3 个答案:

答案 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