Как я нахожу метку времени на файле и затем повторяю его в содержание файла как первая строка?

У меня есть следующая команда, которую я пытаюсь настроить:

 stat -c %y test.txt | sed 's/^\([0-9\-]*\)/\1/'

Это возвращает следующую информацию:

 2016-08-03 14:52:24.000000000

Я должен настроить это так, чтобы это исключило ".000000000". Я попробовал несколько различных вариантов, но, может казаться, не разбираюсь в нем. В конечном счете я должен взять метку времени, которую я извлекаю из вышеупомянутой команды и повторяю ее как первую строку в файл.

У меня есть эта команда как пример, который, кажется, правильно добавляет новую строку к вершине файла:

   sed -i '1s/^/this should be a date\n/' test.txt

Как я комбинирую две команды?

4
задан 3 August 2016 в 13:56

3 ответа

sed -i "1i$(stat -c %y test.txt | sed -r 's/\.[0-9]+ / /')" test.txt
4
ответ дан 23 November 2019 в 11:40

Как так:

( stat -c %y test_file.txt | awk -F '.' '{print $1}' ; cat test_file.txt  ) > /tmp/temp_file && mv /tmp/temp_file test_file.txt

Вот маленькая демонстрация:

$> echo "Hello World" > test_file.txt
$> ( stat -c %y test_file.txt | awk -F '.' '{print $1}' ; cat test_file.txt  ) > /tmp/temp_file &&                       
> mv /tmp/temp_file test_file.txt
$> cat test_file.txt                                                                                                     
2016-08-03 09:24:27
Hello World

Объяснение:

  • Мы получаем метку времени и содержание файла в подоболочке, показанной круглой скобкой (...)
  • stat -c %y test_file.txt | awk -F '.' '{print $1}' метка времени trimps
  • cat test_file.txt содержание файла чтений.
  • Получающийся текст является меткой времени плюс то, что было в файле, перенаправляется к /tmp/temp_file
  • Наконец мы заменяем исходный файл содержанием /tmp/temp_file
5
ответ дан 23 November 2019 в 11:40

Как насчет использования ed вместо sed?

$ ed -s test.txt << EOF
0r !stat -c \%y %
1 s/\.[0-9]*//
w
q
EOF

Это говорит:

  • считайте вывод команды stat -c \%y % и вставьте его в положении 0 в буфере т.е. перед первой строкой. Отметьте это в ed, незавершенное % сокращение от текущего файла.
  • на этом (теперь сначала) строка, ничем не замените вместо десятичного периода и после цифр
  • запишите результат обратно в файл и выйдите

-s является дополнительным - это просто предотвращает ed от количеств строки вывода. Если stat добавляет смещение часового пояса в Вашей локали / часовой пояс, и Вы хотите удалить это также, затем можно изменить s команда для удаления периода и всего после него, например. s/\..*//

Также возможно использовать ed в остроте, берущей ее команды от стандартного входного использования echo или printf, хотя это немного хитро для разбираний в выходе:

printf '0r !stat -c \%%y %%\n1 s/\.[0-9]*//\nw\nq' | ed -s test.txt
4
ответ дан 23 November 2019 в 11:40

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

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