Строка замены, содержащая новую строку в огромном файле

Можно выполнить эту команду "mysql - справка", и можно найти что-то как

Default options are read from the following files in the given order:
C:\WINDOWS\my.ini C:\WINDOWS\my.cnf C:\my.ini C:\my.cnf C:\Program Files\MySQL\M
ySQL Server 5.5\my.ini C:\Program Files\MySQL\MySQL Server 5.5\my.cnf

Существует также страница руководства, говорящая о сервере MySQL, ушел

16
23.05.2017, 15:40
8 ответов

Это действительно тривиально на Perl, вы не должны ненавидеть это!

perl -i.bak -pe 's/>\n/>/' file

Объяснение

  • -i : отредактируйте файл на месте, и создайте резервную копию оригинального файла с именем file.bak. Если вам не нужна резервная копия, просто используйте -i -pe вместо этого.
  • -pe : читайте входной файл построчно и выводите каждую строку после применения скрипта, названного -e.
  • s/>\n/>/ : подстановка, так же как и sed.

И вот awk подход:

awk  '{if(/>$/){printf "%s",$0}else{print}}' file2 
14
27.01.2020, 19:48

Решение perl:

$ perl -pe 's/(?<=>)\n//'

Объяснение

  • s/// используется для подстановки строк.
  • (?<=>) - шаблон lookbehind.
  • \n совпадает с новой строкой.

Весь шаблон значений удаляет все новые строки, перед которыми >.

7
27.01.2020, 19:48

Вы должны иметь возможность использовать sed с командой N, но хитрость заключается в том, чтобы удалять одну строку из пространства шаблона каждый раз, когда вы добавляете другую (так, чтобы пространство шаблона всегда содержало только 2 последовательные строки, вместо того, чтобы пытаться читать во всем файле) - попробуйте

sed ':a;$!N;s/>\n/>/;P;D;ba'

EDIT: после повторного прочтения Питериса Круминса Известного Sed One-Liners Explained я считаю, что лучшим решением sed было бы

sed -e :a -e '/>$/N; s/\n//; ta'

, которое добавляет следующую линию только в том случае, если она уже сделала > совпадение в конце, и должно условно зацикливаться обратно, чтобы обрабатывать случай последовательных совпадений линий (это 39 Крумина). Если строка заканчивается обратной косой чертой "\", добавьте строку к следующей, за исключением замены > на \ в качестве соединительного символа, и того факта, что соединительный символ сохраняется в выводе).

.
1
27.01.2020, 19:48

Как насчет этого:

sed ':loop
  />$/ { N
    s/\n//
    b loop
  }' file

Для GNU sed можно также попробовать добавить опцию -u (--unbuffered) согласно вопросу. GNU sed также доволен этим как простым одиночным лайнером:

sed ':loop />$/ { N; s/\n//; b loop }' file
3
27.01.2020, 19:48

Есть много способов сделать это, и большинство из них действительно хорошие, но я думаю, что этот мой любимый:

tr '>\n' '\n>' | sed 's/^>*//;H;/./!d;x;y/\n>/>\n/'

Или даже:

tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
-1
27.01.2020, 19:48

sed не предоставляет способа испускать выход без конечной новой строки. Ваш подход, использующий N, в принципе работает, но сохраняет в памяти неполные строки, и поэтому может не сработать, если строки станут слишком длинными (имплантации успокоительного типа обычно не предназначены для работы с очень длинными строками).

Вместо этого можно использовать awk.

awk '{if (/<$/) printf "%s", $0; else print}'

Альтернативным подходом является использование tr для замены символа новой строки на "скучный", часто встречающийся символ. Здесь может сработать пробел - выберите символ, который имеет тенденцию появляться в каждой строке или, по крайней мере, большую часть строк в ваших данных.

tr ' \n' '\n ' | sed 's/> />/g' | tr '\n ' ' \n'
1
27.01.2020, 19:48

В конечном итоге я использовал gsar, как описано в , этот ответ вот так:

gsar -F '-s>:x0A' '-r>'
0
27.01.2020, 19:48

Порядок операций, вызывающих запрос пароля с истекшим сроком действия:

  • SSH запускает этап PAM account , на котором проверяется существование и действительность учетной записи. На этапе учетная запись сообщает о том, что срок действия пароля истек, и сообщает об этом SSH.
  • SSH выполняет аутентификацию на основе ключа. Для этого не требуется PAM, поэтому не выполняется этап проверки подлинности . Затем устанавливается сеанс входа в систему SSH и запускается этап сеанса PAM.
  • Затем SSH запоминает сообщение PAM о том, что срок действия пароля истек, распечатывает предупреждающее сообщение и просит PAM изменить пароль пользователя. Затем SSH отключается.

Все это делается SSH, и я не вижу никаких параметров SSH для настройки этого поведения. Таким образом, если вы не хотите создавать пользовательскую версию SSH и/или PAM, единственный вариант, который я вижу, это запретить PAM сообщать устаревший пароль SSH. При этом будет полностью отключена проверка паролей с истекшим сроком действия через SSH , даже если пользователь выполняет вход через SSH с паролем. Другие (не-SSH) методы входа в систему по-прежнему проверяют истечение срока действия пароля.

Текущий файл pam.d/sshd содержит запись «включить общий счет ». Я предполагаю, что существует файл общей учетной записи , который содержит ссылку на pam _ unix.so . Это строка, в которой выполняется проверка пароля с истекшим сроком действия.

Вероятно, вы не хотите касаться самого файла общей учетной записи , поскольку он используется для других методов входа в систему. Вместо этого необходимо удалить include из файла pam.d/sshd . Если в общем счете помимо pam _ unix.so есть и другие функции, их, вероятно, необходимо поместить непосредственно в pam.d/sshd .

Наконец, помните, что это изменение безопасности вашей системы, и вы не должны просто слепо доверять мне, чтобы дать вам хороший совет. Прочитайте, как работает PAM, если вы не знакомы с ним. Некоторые стартовые места могут быть человек 7 PAM , человек 5 pam.conf и человек 8 pam_unix.

-121--35390-

Может быть...

ipcs | sed -n '
    s/[^ ]*  *//
    /^Messages/q
    /^Semaphores/cshift
    /  *bob .*/!d;s///
    / /!s/./ipcrm $1 &/p
'| sh -s -- shm \-s

Удаляет строки, которые не содержат последовательности bob в качестве третьего космоса разделенного поля или , которые не имеют во втором поле Сообщения/семафоры.

Вставляет последовательность ipcrm $1 < поле 2 > для оставшихся строк. Он прекращает ввод при совпадении Messages и заменяет Semaphores match w/ shift . Вывод

sed интерпретируется процессом оболочки с двумя позициями shm/-s . Таким образом, когда sed говорит shift , что оболочка прекращает выполнение команды ipcrm shm < field2 > и начинает выполнение -s в месте shms.

Я думаю, если бы вы хотели чистого решения оболочки, это подошло бы близко:

set -f; IFS='
'; for l in $(ipcs); 
do IFS=\ ;set -- $l
case "$1:$2:${3#bob}" in
(-*:Sh*) a=shm;; 
(-*:Se*) a=-s;; 
(-*:Me*) break 2;;
(*:*:) ipcrm "$a" "$2";;
esac; done
-121--84725-

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

ed -s test.txt <<< $'/fruits/s/apple/banana/g\nw'

(через http://wiki.bash-hackers.org/howto/edit-ed )

1
27.01.2020, 19:48

Теги

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