наиболее общий способ сделать это:
hwclock --systohc --localtime
, который сохраняется при перезагрузках и работает в большинстве систем.
Вот вы:
Для (GNU sed) :
sed -e ':x' -e 'N' -e '$!bx' -e 's/\n/ /g' -e 's/ </\n</g' yourFile
Для (BSD sed) :
sed -e ':x' -e 'N' -e '$!bx' -e 's/\n/ /g' -e 's/ \</\'$'\n</g' yourFile
Вот как я это сделал:
: x
N
x
в первой части команды - $! Bx
, поэтому он не будет применять связанную с пробелом подстановку в последней строке, так как мы должны сохранить последнюю новую строку
) в пространстве шаблонов <
, за которым следует пробел с новой строкой, за которым следует <
. Использование awk
, paste
и sed
awk '/</{a=1}/>/{print;a=0}a' file | paste -d "" -s | sed 's/></>\n</g'
С awk
awk 'BEGIN{RS=">\n+";ORS=">\n";FS="\n"} {$1=$1}1' yourfile
< Jan 20, 2016 11:58:09 AM EST Test1 Sample Test1 >
< Jan 20, 2016 11:58:09 AM EST Sample Test It is not T1 T2 >
Если вам нужна пустая строка между каждым выводом, вы можете добавить дополнительный \ n
в ORS
то есть
awk 'BEGIN{RS=">\n+";ORS=">\n\n";FS="\n"} {$1=$1}1' yourfile
(хотя это может также добавить завершающую пустую строку в конце файла).
Похоже, по сути, вы хотите удалить все символы новой строки, кроме тех, которые следуют за >
, так что:
perl -pe 's/(?<!>)\n//'
получится. (? - это отрицательный оператор look behind. Таким образом, это
\n
, если ему не предшествует >
.
Если нужно удалить все символы новой строки, которые находятся между совпадающими <...>
парами и, как в вашем новом примере, которые могут быть вложены, то это становится сложнее:
perl -0777 -pe 's{<(?:(?0)|[^<>])*>}{$& =~ s/\n//gr}gse'
Здесь используется рекурсия в perl regexps ((?0)
снова относится ко всему regexp).