Почему эта команда sed не заменяет предпоследнее «и»?

Выпуск:Ошибка показывает

Err:1 http://repo.kali.org/kali kali-rolling InRelease

Мы понимаем, что репозиторий http://repo.kali.org/kali

Теперь я пытаюсь открыть ссылку с помощью firefox, и вижу: "У вас нет прав доступа к /kali на этом сервере"(http://repo.kali.org/kali)

enter image description here

Решение 1:

Попробуйте использовать репозиторий https, выполнив следующую команду

echo "deb https://http.kali.org/kali kali-rolling main non-free contrib" > /etc/apt/sources.list

Затем попробуйте sudo apt-get updateЕсли вы обнаружите ту же ошибку, выберите другое решение.

Решение 2:выполните следующую команду.

apt-key adv --keyserver hkp://keys.gnupg.net --recv-keys 7D8D0BF6

Затем попробуйте sudo apt-get updateЕсли вы обнаружите ту же ошибку, выберите другое решение.

Решение 3:Сохраните резервную копию файла перед изменением файла sources.list. С помощью текстового редактора добавьте эти строки в файл /etc/apt/sources.list

deb http://http.kali.org/ /kali main contrib non-free
deb http://http.kali.org/ /wheezy main contrib non-free
deb http://http.kali.org/kali kali-dev main contrib non-free
deb http://http.kali.org/kali kali-dev main/debian-installer
deb-src http://http.kali.org/kali kali-dev main contrib non-free
deb http://http.kali.org/kali kali main contrib non-free
deb http://http.kali.org/kali kali main/debian-installer
deb-src http://http.kali.org/kali kali main contrib non-free
deb http://security.kali.org/kali-security kali/updates main contrib non-free
deb-src http://security.kali.org/kali-security kali/updates main contrib non-free 

Затем попробуйте sudo apt-get updateЕсли вы обнаружите ту же ошибку, выберите другое решение.

3
27.05.2020, 07:18
2 ответа

Это трудно сделать, так как sedне поддерживает осмотр -вокруг и т. д. (, как это можно сделать в PCRE ). Было бы проще перевернуть строку и заменить третье вхождение перевернутого слова с начала, а затем снова перевернуть.

$ echo 'dog and foo and bar and baz land good' | rev | sed 's/\<dna\>/XXX/3' | rev
dog XXX foo and bar and baz land good

Что касается того, почему ваше выражение не работает, это похоже на ошибку. Обратная -ссылка \3кажется строкой  baz land, как будто \bперед andв .*\band\bникогда не имело никакого эффекта.

Команда

sed -E 's/(.*)\<and\>((.*\<and\>){2})/\1XYZ\2/'

, кажется, делает правильную вещь в OpenBSD со своим родным sed(, который использует \<и \>вместо\b).

Мне еще предстоит найти существующий отчет об ошибке GNU sedили GNU glibcпо этому поводу, хотя я не удивлюсь, если это как минимум связано с ошибкой glibc. 25322(потому что см. ниже ).

Вы можете обойти это, указав немного больше подробностей.:

sed -E 's/(.*)\band\b(.*\band\b.*\band\b)/\1XYZ\2/'
3
19.03.2021, 02:29

Предлагаю создать проблему. Я протестировал эти примеры, которые приводят к такому же поведению с GNU grep, GNU sedи GNU awk. Кроме одного случая, который отмечен ниже.

  • Неправильный вывод:

    $ echo 'cocoa' | sed -nE '/(\bco){2}/p'
    cocoa
    

    sed -nE '/(\<co){2}/p'и awk '/(\<co){2}/'тоже ведут себя некорректно, но grep -E '(\<co){2}'правильно не выводит

  • Правильное поведение, нет выхода:

    $ echo 'cocoa' | sed -nE '/\bco\bco/p'
    
  • Неправильный вывод :есть только 1 целое слово itпослеwith

    $ echo 'it line with it here sit too' | sed -E 's/with(.*\bit\b){2}/XYZ/'
    it line XYZ too
    
  • Правильное поведение, ввод не изменен

    $ echo 'it line with it here sit too' | sed -E 's/with.*\bit\b.*\bit\b/XYZ/'
    it line with it here sit too
    
  • Изменение границ слов на \<и \>приводит к другой проблеме.

    Правильно не изменяет ввод:

    $ echo 'it line with it here sit too' | sed -E 's/with(.*\<it\>){2}/XYZ/'
    it line with it here sit too
    

    Это правильно изменяет ввод

    $ echo 'it line with it here it too' | sed -E 's/with(.*\<it\>){2}/XYZ/'
    it line XYZ too
    

    Но этот не может изменить ввод

    $ echo 'it line with it here it too sit' | sed -E 's/with(.*\<it\>){2}/XYZ/'
    it line with it here it too sit
    

Кроме того, проблемное поведение наблюдается только в том случае, если конфликтующее слово имеет лишние символы в начале. Например, itи sit. Но не в том случае, если в конце есть символы. Например, itи siteи item.

$ echo 'it line with it here item too' | sed -E 's/with(.*\bit\b){2}/XYZ/'
it line with it here item too
$ echo 'it line with it here it too item' | sed -E 's/with(.*\<it\>){2}/XYZ/'
it line XYZ too item
0
19.03.2021, 02:29

Теги

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