Дата Синтаксис синтаксис является тайной и ошибками, что делает вызов командной строки болей. Поэтому я написал небольшой скрипт (я назвал его во всем мире ), который будет распечатан указанный (или текущий) время от базового времени Zome (ваш локальный) в некоторых других часовых зонах и общение.
Вот оно. Отрегулируйте его, чтобы соответствовать вашим потребностям, поместите его на свой путь и сделайте его исполняемым.
#!/bin/sh # # Print the specified (or current) time from base time in other time zones # and the converse # # Base time zone from/to which to convert TZBASE=Europe/Athens # Time zones to display # See /usr/share/zoneinfo/ for more names TZONES='UTC America/Los_Angeles America/New_York Europe/London Europe/Paris' # Display format FORMAT='%H:%M (%p) %Z %a %m %b %Y' if [ "$1" ] ; then time="$1" else time=`date +%T` fi # Show the time from the specified input time zone in the specified output # time zone showtime() { TZIN=$1 TZOUT=$2 TZ=$TZOUT date --date='TZ="'$TZIN'"'" $time" +"$time $TZIN is $TZOUT $FORMAT" } for tz in $TZONES ; do showtime $TZBASE $tz done echo for tz in $TZONES ; do showtime $tz $TZBASE done-121--2959-
gawk ' BEGIN{RS=""; FS="\n"}
{for(i=1;i<NF;i++) {a[i]=a[i]" || "$i} }
END {for(i in a){ print a[i]}}'
(это решение может изменить порядок линий; следующая версия сохраняет порядок строки).
Даже лучше, улучшить его и создать многоразовую команду «Vert_Transpose»
#!/usr/bin/gawk -f
BEGIN {RS=""; FS="\n"}
l<=NF {l=NF}
{for(i=1;i<=NF;i++) { a[i]=a[i]" || "$i } }
END {for(i=1;i<=l ;i++) { print a[i] } }
chmod и установить его в некоторых $ HOME / BIN
; и всякий раз
Необходимо использовать его как общую команду:
Vert_Transpose LongFile
:%! vert_transpose
Сценарий, кажется, предполагается, что в файле есть строка (или больше линий), содержащих строку «MD5Change». Он отображает такую строку на экране, опорожняющий (но не удалять) строку, содержащую эту строку, затем удаляя все пустые строки в файле, наконец, добавление новой линии «MD5Change» в файл (что не обязательно так же, как Отображается один в первом Echo
), наконец-то печатаю «Готово». Вы должны удалить CAT $ 1 |
, однако, потому что $ 1
уже представлен как аргумент «inplace» для SED
.
Edit: Я предполагаю, что вы можете запустить свой код, например:
timestamp=md5change$(date +%s)
echo "${timestamp}"
sed -i "/md5change/s/.*/${timestamp}/" "$1"
echo "done"
(Примечание. Этот код не эквивалентен вашим шаблона кода, поскольку ваш код удаляет все пустые строки в файле, удаляет несколько записей «MD5Change» в Файл и добавляет в конце файла. Если эта компактная версия меняет существующие записи «MD5Change» на новом. Я думаю, что это то, что вы на самом деле хотите, и это исправляет некоторые проблемы с вашим оригинальным кодом.)
Вы почти у цели! Вот однострочное решение с использованием выбранных вами инструментов, sed
и date
:
$ sed -i "s/^md5change.*/md5change$(date +%s)/" FILE
Я не уверен, зачем вам эта вторая команда sed
( который удаляет все строки, в которых отсутствуют непробельные символы, хотя не-GNU sed
может не распознать \ t
). Предполагая GNU, добавьте ; / ^ [\ t] $ / d
до конца цитируемой части. Без GNU просто поместите буквальную табуляцию вместо экранированной версии.
Однострочник не будет работать, если у вас еще нет строки «md5change». Для этого вам сначала понадобится другая строка:
#!/bin/sh
epoch=$(date +%s)
if grep ^md5change "$1"
then sed -i "s/^md5change.*/md5change$epoch/" "$1"
else echo "md5change$epoch" >> "$1"
fi
Обратите внимание, что date +% s
- это , а не переносимый! Стандарт POSIX не определяет его, хотя версии GNU и BSD date
поддерживают его. Вы можете использовать perl -e «время печати»
или выполнить всю логику на реальном языке (например, perl
):
#!/usr/bin/perl -i -pn
$_ = $1 . time . "\n" if /^(md5change)/
Это ищет строку, начинающуюся с «md5change ", а затем заменяет его совпадающей частью ( $ 1
-" md5change "), соединенной с эпохой, а затем новой строкой. -i
перезапишет ввод (ы) (точно так же, как sed -i
- то же самое, что sed --in-place
), -n
выполняет итерацию по каждой строке ввода с переменной по умолчанию ( $ _
), представляющей текущую строку, а -p
выводит $ _
в конец команд -e
(в каждой строке).
Чтобы удалить пустые строки, преобразуйте аргумент perl -pn
в -n
и добавьте новую строку в конце, которая говорит print if / \ S /
Вы также можете преобразовать этот сценарий в однострочник для командной строки:
$ perl -i -pne '$_ = $1 . time . "\n" if /^(md5change)/'
или
$ perl -i -ne '$_ = $1 . time . "\n" if /^(md5change)/; print if /\S/'
Для работы с входным файлом, в котором отсутствует строка «md5change»:
#!/usr/bin/perl -i
my $md5change = 0;
while (<>) {
if (/^(md5change)/) {
$_ = $1 . time . "\n";
$md5change = 1;
}
print;
} continue {
if (eof and not $md5change) {
$md5change = 0;
print "md5change" . time . "\n";
}
}