2015-12-29 4 views
-1

файл содержит строки, как следующее:TCL: Grep, регулярное выражение, чтобы удалить строку шаблона из файла

str1.str2. 
str1.str2.str3. 
str1.str2.str3.1. 
str1.str2.str3.1.p 

, когда разбор файла построчно, если затем $str = "str1.str2." удалить все строки, кроме str1.str2.str3. для этого я использую это :

exec sh -c "grep $str file |grep -v $str[A-Za-z_0-9]\+\.[A-Za-z_0-9] |grep -v ^$str.$ > dest_file" 

но это один я не работает «неправильная команда [A-Za-z_0-9] !!

, что случилось с этим TCL с ommand

+1

Вспомните, что синтаксис подстановки команды Tcl - '[command]' с квадратными скобками. Поскольку конвейер grep находится в строке с двойными кавычками, Tcl попытается выполнить подстановку команд и переменных в строке. Вам нужно будет скрыться от '[' - см. Http://www.tcl.tk/man/tcl8.6/TclCmd/Tcl.htm –

+1

. У вас также есть те же проблемы, что и с другим вопросом. Любая обратная косая черта, которую вы хотите передать оболочке, должна быть удвоена. Анкер '' ', переданный grep, должен быть защищен как от tcl, так и от оболочки. –

ответ

1

Если я понял это хорошо, имея файл, как это на входе:

$ cat file 
blah 
str1.str2. 
str1.str2.str3. 
str1.str2.str3.1. 
str1.str2.str3.1.p 
blah 

Вы хотите в выходе на одну строку, содержащую str1.str2.str3.. Если это так, вы можете заменить несколько, по конвейеру, команды Grep ни с одной:

$ grep -E ${str}[^.]+.\$ file 
str1.str2.str3. 

Как сообщалось в комментариях здесь выше, вам придется «защитить» от обратной косой черты замещения TCL путем их удвоения.

Смежные вопросы