2016-02-24 4 views
0

Я использовал exec в прошлом для запуска основных команд bash и awk, а также от tcl.Как использовать exec для запуска bash один лайнер

Но на этот раз я запускаю сложный 1 лайнер для редактирования имени переменной.

set v "sccmp_hvt_c35_ff_0.99v_125c.lib" 
set corner_name [exec "echo $v | cut -d'.' --complement -f2- | cut -d'_' --complement -f-5 | tr '[a-z]' '[A-Z]'"] 

Это не работает и бросали error for '[a-z]' как неверную команду. Есть ли способ, который может помочь мне запустить этот скрипт bash через tcl?

+0

Какой ваш желаемый результат? Это «SCCMP_HVT_C35_FF»? –

ответ

2

квадратные скобки должны быть экранированы:

# wrong 
exec echo abc | tr [a-z] [A-Z] 

# good 
exec echo abc | tr \[a-z\] \[A-Z\] 

В вашем случае, я хотел бы попробовать:

set corner_name [exec "echo $v | cut -d'.' --complement -f2- | cut -d'_' --complement -f-5 | tr \[a-z\] \[A-Z\]"] 

EDIT

Кроме того, я думаю, что кавычки не нужны :

set corner_name [exec echo $v | cut -d. --complement -f2- | cut -d_ --complement -f-5 | tr \[a-z\] \[A-Z\]] 
+0

Пробовал, но при этом он не пишет такого файла или каталога. –

+0

Я отредактировал свой ответ: '' 'может не понадобиться – purplepsycho

+0

Мне также нужно сбежать 'после вырезания, потому что теперь он выдает ошибку для разреза, говоря: cut: разделитель должен быть единственным символом –

1

Я думаю, что вы пытаетесь сделать это:

set corner_name [string toupper [join [lrange [split [lindex [split $v .] 0] _] 0 3] _]] 
puts $corner_name ;# => SCCMP_HVT_C35_FF 

, которые вы также можете получить с

string toupper [regexp -inline {^.*?(?:_.*?){3}(?=_)} $v] 
+0

Да, это было желательно вы сделали это изначально в tcl, а затем использовали сценарий оболочки. –