Я надеюсь, что есть какой-то символ — или хотя бы какая-то строка — который никогда не появляется в вашем файле. Я предполагаю, что это верно для |
. Чтобы быть в безопасности, я буду использовать ||
.
Запустите эту команду:
sed -n -e H -e '/^ *\/> *$/ { s/.*//; x; s/.*NS1:name="\([^"]*\)/\1&/; s/\n/||/gp }' your_file | sort | nl -ba | sed -e 's/ *\([0-9]*\)[^|]*||\(.* RDF:about="rdf:#$CHROME\)[0-9]*/\2\1/' -e 's/||/\n/g'
Примечание. :Для этого (возможно )требуется наличие GNU sed.
sed
для преобразования файла в формат, пригодный для сортировки. (подробности ниже ). sed
. nl -ba
, но cat -n
тоже подойдет, и наверняка есть другие варианты. sed
, чтобы отделить номер строки от начала строки и вставьте его после CHROME
. Восстановите данные обратно в исходный формат. sed
команда Команда sort
обрабатывает каждую строку как запись. Поэтому мы берем каждую (запись с разделителями )из вашего входного файла. и соедините все строки, образуя одну длинную строку. Также копируем значение name
в начало строки, чтобы не указывать ключ сортировки.
Используйте параметр -n
для подавления автоматической печати. Строки будут напечатаны только тогда, когда мы скажем p
.
Выполнить H
для каждой строки. Это добавит текущую строку в область хранения. По логике может быть логичнее вскопироватьстроку <
в область хранения (с помощью команды h
)а затем добавьте все последующие строки. Я произвольно выбрал этот подход.
Обратите внимание, что, поскольку мы добавляем строку <
к пустому удержанию, объединенная запись имеет дополнительную новую строку в начале.
Найдите строку, содержащую />
, необязательно, перед и/или за которыми следуют пробелы. Когда мы находим его, мы знаем, что у нас есть полная запись в хранилище. Выполните следующие команды только в этих строках.
s/.*//
очищает пространство шаблонов (, т.е.он стирает строку />
). На самом деле это не выброс какой-либо информации; строка />
уже была добавлена в пробел (, потому чтокаждаястрока добавляется к пространству хранения ). x
меняет местами пространство шаблона и пространство хранения. Это извлекает агрегированную (добавленную / конкатенированную запись ). из пространства удержания в пространство шаблона. Из-за предыдущей команды(s/.*//
)это очищает пространство удержания. s/.*NS1:name="\([^"]*\)/\1&/
ищет поле имени и копирует его значение в начало записи. Это не удастся, если вы можете иметь имя с символами кавычек .s/\n/||/gp
заменяет каждую новую строку в пространстве шаблонов на ||
. (Это шаг, который преобразует запись в одну строку. )Из-за p
это печатает запись. Вывод первой команды sed
при выполнении с файлом примера:
AAA Carolinas||<RDF:Description RDF:about="rdf:#$CHROME1"|| NS1:name="AAA Carolinas"|| NS1:urlToUse=""|| NS1:whereLeetLB="off"|| NS1:leetLevelLB="1"|| NS1:hashAlgorithmLB="md5"|| NS1:passwordLength="16"|| NS1:usernameTB="user"|| NS1:counter=""|| NS1:charset="a9b0c8d1e7f2g6h3i5j4klmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV123456789"|| NS1:prefix="6%Fl"|| NS1:suffix="I$5g"|| NS1:protocolCB="false"|| NS1:subdomainCB="true"|| NS1:domainCB="true"|| NS1:pathCB="false"|| />
Adobe Forums||<RDF:Description RDF:about="rdf:#$CHROME2"|| NS1:name="Adobe Forums"|| NS1:urlToUse="adobeforums.com"|| NS1:whereLeetLB="off"|| NS1:leetLevelLB="1"|| NS1:hashAlgorithmLB="md5"|| NS1:passwordLength="12"|| NS1:usernameTB="username"|| NS1:counter=""|| NS1:charset="a9b0c8d1e7f2g6h3i5j4klmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV"|| NS1:prefix=""|| NS1:suffix=""|| NS1:protocolCB="false"|| NS1:subdomainCB="true"|| NS1:domainCB="true"|| NS1:pathCB="false"|| NS1:pattern0="*adobeforums.com*"|| NS1:patternenabled0="true"|| NS1:patterndesc0=""|| NS1:patterntype0="wildcard"|| />
Adorama||<RDF:Description RDF:about="rdf:#$CHROME3"|| NS1:name="Adorama"|| NS1:urlToUse="adorama.com"|| NS1:whereLeetLB="off"|| NS1:leetLevelLB="1"|| NS1:hashAlgorithmLB="md5"|| NS1:passwordLength="8"|| NS1:usernameTB="username"|| NS1:counter=""|| NS1:charset="a9b0c8d1e7f2g6h3i5j4klmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV"|| NS1:prefix=""|| NS1:suffix=""|| NS1:protocolCB="false"|| NS1:subdomainCB="false"|| NS1:domainCB="true"|| NS1:pathCB="false"|| NS1:pattern0="*adorama.com*"|| NS1:patternenabled0="true"|| NS1:patterndesc0=""|| NS1:patterntype0="wildcard"|| NS1:pattern1="www.adoramapix.com*"|| NS1:patternenabled1="true"|| NS1:patterndesc1=""|| NS1:patterntype1="wildcard"|| />
sed
команда s/ *\([0-9]*\)[^|]*||\(.* RDF:about="rdf:#$CHROME\)[0-9]*/\2\1/
разбивает строку на части:
\1
. name
и ||
после него. RDF:about="rdf:#$CHROME
. Это становится группой \2
. Затем он заменяет первые пять частей с RDF:about="rdf:#$CHROME
и номером строки (новый номер записи ). Поскольку остальная часть записи не была совмещена, на него не влияет команда.
s/||/\n/g
заменяет каждый ||
новой строкой, восстановление (воссоздание )исходной многострочной -структуры файла.
… для отправки вывода в файл, добавить > your_output_file
в самом конце последней строки команды (, т.е. в конце второй sed
). Затем вы можете переместить(mv
) your_output_file
в исходный файл. Нет никакого смысла указывать опцию--output=
(или -o
). на команду sort
; вывод изsort
должен войти в команду который применяет номера строк. Если вы хотите захватить промежуточный файл, скажите об этом.
Завершено определение псевдонима в ~\.bash_aliases
.
alias reportbug-pass='reportbug --smtppasswd="$(secret-tool lookup eds-origin evolution-data-server e-source-uid 7f1e149e069bd66ab5aa1a734baa113943cdf0ee)"'
Использование этого псевдонима вместо вызова reportbug
напрямую вызывает reportbug с уже переданным ему --smtppasswd
. Теперь, если я хочу передать свой SMTP-пароль на reportbug
, я могу вместо этого ввести этот псевдоним. Вы можете передать ему другие параметры, например, имя сообщаемого пакета, как и в reportbug
.
$ reportbug-pass
Вместо псевдонима того же результата можно добиться, определив функцию в~\.bash_aliases
function reportbug-pass() {
reportbug --smtppasswd="$(secret-tool lookup eds-origin evolution-data-server e-source-uid pdljjhvbuo6uvc7mydavpmbjqqhxqq2jyhqdndpmcvamknbih8cifgfg)" "$@"
}
В этой функции параметр "$@"
расходуется на передаваемые ей аргументы , чтобы можно было передать, например, имя пакета.
В этом случае, будь то псевдоним или функция, запрос к связке ключей происходит, когда вы вызываете ее из командной строки. Если брелок заблокирован, вы получите обычную графическую подсказку, чтобы разблокировать брелок.