Передача переменной в команду sed

Мне нужно передать значение переменной в команду sed. вот описание, что я делаю.

я присваиваю значение переменной:

export ALSIZE=14420 $ echo $ALSIZE 14420

теперь я использую это значение в команде sed для чтения файла из строки $ALSIZE до конца файла. и я получил ошибку

$  sed -n '$ALSIZE,$p' /db1/u04/oradata/GG11/ggserr.log
Unrecognized command: $ALSIZE,$p ====== >> 

использовал значение переменной в "" (двойные кавычки) все равно получил ошибку.

$ sed -n '"$ALSIZE",$p' /db1/u04/oradata/GG11/ggserr.log
Unrecognized command: "$ALSIZE",$p  ===== >>> 

я получаю ответ

$ sed -n '14420,$p' /db1/u04/oradata/GG11/ggserr.log

2013-12-26 06:36:17  INFO    OGG-01026  Oracle GoldenGate Capture for Oracle, dpsbprd.prm:  Rolling over remote file ./dirdat/siebel/r1003911.

2013-12-26 06:43:31  INFO    OGG-01026  Oracle GoldenGate Capture for Oracle, dpsbprd.prm:  Rolling over remote file ./dirdat/siebel/r1003912.
2013-12-26 11:07:47  INFO    OGG-01026  Oracle GoldenGate Capture for Oracle, dpsbprd.prm:  Rolling over remote file ./dirdat/siebel/r1003913.

какая ошибка я делаю Не могли бы вы, пожалуйста, совет?

3 ответа

Все это будет работать:

sed -n $ALSIZE',$p' /db1/u04/oradata/GG11/ggserr.log
sed -n "$ALSIZE"',$p' /db1/u04/oradata/GG11/ggserr.log
sed -n "$ALSIZE,\$p" /db1/u04/oradata/GG11/ggserr.log

Ключ к пониманию того, как работает цитирование:

  • Вы можете указать часть строки или все: hello, hel'lo', 'hello', 'hel''lo' все одинаковы с оболочкой
  • Переменные оболочки в двойных кавычках расширяются до их значения: "$ALSIZE" расширен до "14420", который не нужно заключать в кавычки, чтобы вы могли написать просто $ALSIZE без цитирования
  • Переменные оболочки в одинарных кавычках не раскрываются, поэтому '$ALSIZE' будет использоваться буквенный текст "$ALSIZE", который не является тем, что вы хотите
  • в "$ALSIZE,\$p" пример второй $ необходимо избежать, чтобы предотвратить расширение оболочки $p переменная, которая, вероятно, не имеет значения

Одинарные кавычки означают, что "$" в $ALSIZE раскрывается как литерал "\$ALSIZE". Что произойдет, если переписать это на:

sed -n $ALSIZE',$p' /db1/u04/oradata/GG11/ggserr.log

(оставляя одинарные кавычки до переменной $ALSIZE)?

Используйте двойные кавычки:

kent$  s=5

kent$  seq 10 |sed -n "$s,$ p"
5
6
7
8
9
10
Другие вопросы по тегам