LinuxForum.Fans
Тема

использование переменных и sed в скрипте

Автор: Cruiser78 7 сообщений 3431 просмотров
#376674

Привет всем!

Есть некий текст, в котором надо заменить вхождение одних символов на другие. Решается это элементарно, с помощью sed:

text
cat text | sed 's/bar/foo/'

Но - стоит чуть усложнить задачу - организовать скрипт, в котором заменяющий, например, текст есть некое вычисляемое значение, есть переменная, то как тогда значение этой переменной передать sed'у?
Что-то вроде:

text
cat text | sed 's/bar/$foo/'

Но это - не работает.

Что то я туплю...

#376676

Кавычки попробуйте поменять:

text
/tmp/ cat test.txt 
123
1234
234
█▓▒░lupo@asus-x201e█▓▒░ Вт апр 15 02:44:35 
/tmp/ sed "s/123/`whoami`/g" test.txt
lupo
lupo4
234
█▓▒░lupo@asus-x201e█▓▒░ Вт апр 15 02:44:39 
/tmp/ i=`whoami`; sed "s/123/${i}/g" test.txt
lupo
lupo4
234

P.S. А зачем?

text

cat FILE | sed ...

Почему не написать просто?

text

sed ... FILE
#376677

Cruiser78, используйте двойные кавычки. И да, cat не нужен.

#376682
"Cruiser78" написал:
есть некое вычисляемое значение, есть переменная, то как тогда значение этой переменной передать sed'у?

[console][xxblx@localhost ~]$ a=5
[xxblx@localhost ~]$ echo $a
5
[xxblx@localhost ~]$ echo 123 >> test
[xxblx@localhost ~]$ echo 223 >> test
[xxblx@localhost ~]$ echo 323 >> test
[xxblx@localhost ~]$ cat test
123
223
323
[xxblx@localhost ~]$ sed "s/123/$a/" test
5
223
323
[/console]

[console][xxblx@localhost ~]$ touch test2
[xxblx@localhost ~]$ echo 123123123===TEXT===123123123 >> test2
[xxblx@localhost ~]$ cat test2
123123123===TEXT===123123123
[xxblx@localhost ~]$ sed "s/123/`grep -o TEXT test2`/" test
TEXT
223
323[/console]
С двойными кавычками работает.

#376708
-=Serj=- написал:
Cruiser78, используйте двойные кавычки. И да, cat не нужен.

Дело не в cat'е. Он только для затравки. Там иная команда стоит, которая гонит свой вывод в стандартный поток. Всем спасибо.

#376719

Тогда на будущее, чтобы за cat не ругали, используй echo. ;)

#377552
"Cruiser78" написал:
cat text | sed 's/bar/$foo/'

[console]sed "s/bar/$foo/"[/console]
другое решение
[console]sed 's/bar/'"$foo"'/'[/console]
третье:
[console]VAR="echo \"sed s/bar/$foo/\""
eval "$VAR"[/console]

"Cruiser78" написал:
. Там иная команда стоит, которая гонит свой вывод
так лучше не делать.
Войдите или зарегистрируйтесь, чтобы ответить.