Добавление 1 строки к концу файла, Даже когда работал многократно для изменения MD5

Дата Синтаксис синтаксис является тайной и ошибками, что делает вызов командной строки болей. Поэтому я написал небольшой скрипт (я назвал его во всем мире ), который будет распечатан указанный (или текущий) время от базового времени 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 ; и всякий раз Необходимо использовать его как общую команду:

  • в Bash: Vert_Transpose LongFile
  • Внутри VIM: :%! vert_transpose
0
24.03.2015, 17:18
2 ответа

Сценарий, кажется, предполагается, что в файле есть строка (или больше линий), содержащих строку «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» на новом. Я думаю, что это то, что вы на самом деле хотите, и это исправляет некоторые проблемы с вашим оригинальным кодом.)

0
28.01.2020, 04:57

Вы почти у цели! Вот однострочное решение с использованием выбранных вами инструментов, 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";
  }
}
0
28.01.2020, 04:57

Теги

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