ファイル内の二重引用符内の単語を抽出するにはどうすればよいですか?例えば
variable "xxx"
テキスト ファイルを 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
}
(括弧内の引用符を 2 重にする必要はまったくありません。必要なのは 1 つだけです。ただし、ハイライターがここで正しいことを行うことを意味します。)
引用符で囲まれたすべての文字列を見つける最も簡単な方法は次のとおりです。
foreach {- substring} [regexp -inline -all {"([^""]*)"} $data] {
# One of the substrings is $substring at this point
}
それぞれのケースで同じ正規表現を使用していることに注意してください。実際、そのような正規表現 (特に繰り返し使用される場合) を独自の変数に分解して、それらに「名前を付ける」ことができるようにすることは、実際には良い習慣です。
上記のものをすべて組み合わせると:
set FindQuoted {"([^""]*)"}
set fd [open $filename]
foreach {- substring} [regexp -inline -all $FindQuoted [read $fd]] {
puts "I have found $substring for you"
}
close $fd
正規表現だけを探している場合は、TCL のキャプチャ グループを使用できます。例えば:
set string {variable "xxx"}
regexp {"(.*)"} $string match group1
puts $group1
これは を返しxxx
、引用符を破棄します。
ファイルを TCL に直接読み込むことなく、ファイル内のデータを一致させたい場合は、それも可能です。例えば:
set match [exec sed {s/^variable "\(...\)"/\1/} /tmp/foo]
これにより、sed が呼び出されて、必要な一致部分だけが検索され、さらに処理するためにそれらが TCL 変数に割り当てられます。この例では、一致変数はxxx
上記のように設定されていますが、保存された文字列ではなく外部ファイルを操作しています。
ファイル内の引用符で囲まれたすべての単語を検索し、grep
その単語を使用して何かを実行したい場合は、次のようにします(シェルで)。
grep -o '"[^"]*"' | while read word
do
# do something with $word
echo extracted: $word
done