sed для выполнения команды как замены с шаблоном замены как аргумент

Я пытаюсь заменить время в файле журнала:

cat mlog.log | sed -e "s/^[0-9\.]*/\$(date -d @&)/"

Почему это всегда сначала выполняется $(date -d $&) но выполнение замены сначала и затем выполняет команду?

Я думал, что это будет похоже:

date -d @121223232

Журнал похож на это:

1428688532.169   peerdiff 2
1428688534.269   peerdiff 1 
2
задан 11 April 2015 в 01:07

2 ответа

Если mlog.log является разделенным пространством:

cat mlog.log |perl -a  -ne  'chomp($F[0]=`date -d \@$F[0] +%FT%T`); print join(" ",@F)."\n"'

, Если mlog.log является разделенной вкладкой:

cat mlog.log |perl -a -F"\t" -ne  'chomp($F[0]=`date -d \@$F[0] +%FT%T`); print join("\t",@F)."\n"'
1
ответ дан 11 April 2015 в 01:07

Причина, почему это работает как это, состоит в том, как оболочка работает. Сначала это начинает интерпретировать все, что это может. Т.е. это интерпретирует то, что находится в "кавычках. Это не интерпретирует то, что находится в 'кавычках. Попытайтесь соответствовать echo "$(date)" echo '$(date)'. Если Вы хотите сделать то, что Вы хотите Вас, должен использовать другой подход, например, использовать:

awk '{ system("echo `date -d @"$1"` "$2" "$3);}' < mlog.log

Т.е. заставляют awk разделить файл на столбцы и выполниться, система управляют, чтобы Вы питались столбцами по мере необходимости. Вы не можете использовать sed тот же путь, потому что sed s команда не имеет никакой возможности назвать команду оболочки.

0
ответ дан 11 April 2015 в 11:07

Другие вопросы по тегам:

Похожие вопросы: