Grep слово внутри двойной кавычки
Как я могу извлечь слово внутри двойной кавычки внутри файла? например
variable "xxx"
3 ответа
Чтение текстового файла в 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
Внутреннее соответствие
Если вы просто ищете регулярное выражение, то вы можете использовать группы захвата 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