Как объединить строки (многострочной программы)

Para empezar, su marca de tiempo está en segundos desde el 1 de enero de 1970 00 :00 :00 UTC es mi suposición, si no es así, conviértalo a eso.

Entonces, tienes que restar los segundos para los días que quieras.

stamp=1525192000
day=$((60*60*24))
echo $(($stamp - 30*$day))

Luego obtiene un tiempo de época de Unix, si eso necesita conversión a la fecha y la hora del día, es posible que deba tener en cuenta el horario de verano, y ahí es donde es posible que deba usar la utilidad date.

Tenga en cuenta que también puede usar date. Esto le permite trabajar fácilmente con otros elementos de fecha, sin necesidad de cálculo:

Con GNUdate:

date --date="$(date --iso-8601=s -d @1525192000) -30 days" +%s

Ejemplo:

 $ date --date="$(date --iso-8601=s -d @1525192000)"
 Tue, May  1, 2018  7:06:01 PM
 $ date --date="$(date --iso-8601=s -d @1525192000) -30 days"
 Wed, Apr 1, 2018  7:06:01 PM
 $ date --date="$(date --iso-8601=s -d @1525192000) -30 days" +%s
 1523466380
 $ date --date="$(date --iso-8601=s -d @1525192000) -30 days -1 week -3 months" +%s
 1514309200

En FreeBSD y macOS (el -jsignifica no intentar configurar la fecha del sistema, agradable y seguro)

date -j -f "%a %b %d %T %Z %Y" "$(date -r 1234567890)"  -v-30d "+%s"

EDITAR :Gracias, Kusalananda, OpenBSD y NetBSD no son compatibles -v.

1
14.06.2019, 19:22
2 ответа

Один -вкладыш:

awk '{ if ( NF > 0 && $1 !~ /^\/\// ) { bl=0; for (i=1;i<=NF;i++) printf "%s ", $i; }; if ( NF == 0 && bl == 1 ) {printf "\n" }; if ( NF == 0 && bl == 0 ) {bl=1; printf "\n\n" } } END { if ( bl == 0 ) { printf "\n" } } ' /tmp/my_file

Пояснение:

if ( NF > 0 && $1 !~ /^\/\// ) { bl=0; for (i=1;i<=NF;i++) printf "%s ", $i; }

если количество полей больше 0 и первое поле не является комментарием, для каждого поля выведите поле и пробел. На самом деле регулярное выражение "^//" (начинается с "//" ), однако "/" необходимо экранировать, поэтому "\/". Также bl=0 устанавливает флаг предыдущей пустой строки, который мы будем использовать для управления концом записи/дескриптором пустой строки позже в операторе.

Затем обработайте пустые строки/конец записей;

Во-первых, проверьте, не является ли это пустой строкой.

if ( NF == 0 && bl == 1 ) {printf "\n" };

Если количество полей равно 0 и установлен флаг предыдущей пустой строки, просто напечатайте одну новую строку.

Затем проверьте, закончилась ли строка данных/текста и нужно ли добавить строку

if ( NF == 0 && bl == 0 ) {bl=1; printf "\n\n" }

Если количество полей равно 0 и флаг предыдущей пустой строки не установлен, установите флаг пустой строки и распечатайте окончания строк.

Наконец-то!!!

END { if ( bl == 0 ) { printf "\n" } }

если мы закончили файл, посмотреть, было ли напечатано окончание строки записи, если нет, то сделать это.

1
27.01.2020, 23:41

Предполагая, что каждый блок (каждой подпрограммы «проверить ()» )начинается со строки, начинающейся с verifyи заканчивается строкой, начинающейся с }(и что ни одна строка внутри подпрограммы не начинается с }), и что пробел — это все пробелы :

.

бывший

printf '%s\n' 'g|^ *//|d' 'g/^verify/.,/^}/j' x | ex -- /tmp/my_file

Отредактируйте файл с помощьюex(команды -строчной версии vi / vim).

  • g|^ *//|dищет все строки, соответствующие регулярному выражению ^ *//(т. е. содержать //с предшествующим нулем или более пробелами, но ничего другого )и удаляет их.
  • g/^verify/.,/^}/jнаходит все строки, соответствующие регулярному выражению^verify(т. е. начинается с verify). Затем для каждого, найти первую следующую строку, соответствующую регулярному выражению ^}(т. е. начинается с }), и j обозначает все строки между verifyи }, включительно, отбрасывая лишние пробелы до и после новые строки, которые выдавливаются.
  • xсохраняет и выходит.
    Примечание.:При этом входной файл перезаписывается.

сед

sed -n '/^verify/ { h; d }; /^ *\/\//d; /./H; /^}/ { g; s/ *\n */ /gp }; /^$/p' /tmp/my_file
  • -n— не печатать, кроме как по указанию.
  • /^verify/ { h; d }— когда вы видите строку, начинающуюся с verify, скопируйте его в h старое пространство и d удалите пространство шаблона (т. е. перейти к следующей строке ввода без дальнейшей обработки ).
  • /^ *\/\//d— когда вы видите строку который начинается с нуля или более пробелов и //, удалите его (т. е. перейти к следующей строке ввода без дальнейшей обработки ).
  • /./H— для любой не-пустой строки, отличной от указанной выше, добавить его в пространство удержания.
  • /^}/ { g; s/ *\n */ /gp }— когда вы видите строку, начинающуюся с }, g вставьте пространство удержания в пространство шаблона. Затем сожмите его до одной строки путем замены каждой встроенной новой строки (вместе с предшествующим и последующим пробелами )с одним пробелом и распечатайте его.
  • /^$/p— печатать пустые строки.

авк

awk '
    /^ *\/\//   { next; }
    /./         { buffer = buffer " " $0; }
    /^}/        { sub(/^ */, "", buffer); sub(/ *$/, "", buffer);
                  gsub(/ * /, " ", buffer); print buffer; buffer = ""; }
    /^$/        { print; }
    ' /tmp/my_file
  • Если вы видите комментарий, пропустите его.
  • Объединить все остальные не -пустые строки в buffer. Новые строки неявно отбрасываются.
  • Когда вы видите строку, начинающуюся с }, удалите все лишнее пространство из buffer, распечатайте его и очистите.
  • Печатать пустые строки.
0
27.01.2020, 23:41

Теги

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