sed
и perl
по умолчанию работают на линиях; ваша проблема охватывает несколько строк. Поэтому совпадение по вашему вводу по умолчанию невозможно. Два распространенных обходных пути — либо работать со всем файлом сразу, либо использовать конечный автомат, который работает построчно, но отслеживает то, что было просмотрено. Метод всего файла, поиск ваших данных в файле input
и сохранение только нужного бита:
$ perl -0777 -ple 's{<!--\s*(<Manager pathname="" />)\s*-->}{$1}' input
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<Manager pathname="" />
$
Метод конечного автомата более сложен, так как могут быть другие комментарии, которые должны оставаться нетронутыми, и EOF может потребовать специальной обработки, если шаблон сталкивается с этим или нет; эта версия печатает ранее увиденные строки, если это не та строка, которую мы хотим, и в этом случае следующая строка также пропускается. В идеале вы бы хотели, чтобы модульные тесты покрывали любые крайние случаи, возможные с таким кодом.
$ perl -nle 'if (m{<Manager pathname="" />}) { readline } else { print $prev } $prev=$_; END{ print $prev }' input
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<Manager pathname="" />
$
После этого, вероятно, следует выполнить diff
, чтобы подтвердить, что правки изменили только то, что требуется, а затем, возможно, patch
использовать для применения этого различия к будущим версиям файла, что имеет то преимущество, что предупреждает о невозможности для исправления файла и некоторых средств для восстановления из немного других файлов.
$ perl -i.old..
$ diff input.old input > input.patch
Третий метод заключается в том, чтобы полностью разобрать XML в древовидную форму в памяти, а затем манипулировать этим деревом до желаемого нового состояния, а затем создать эту новую форму. Это имеет то преимущество, что с меньшей вероятностью будет вызвано, скажем, случайным пробелом или другими изменениями, из-за которых приведенные выше регулярные выражения не будут соответствовать (, то есть вышеприведенные методы более хрупкие ), но будут более сложными. для настройки и в зависимости от используемого парсера и эмиттера могут внести нежелательные изменения во входной файл.
Загрузите JDK с официального сайта(требуется подписка )или используйте следующую команду:
wget -c --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn/java/jdk/8u281-b09/89d678f2be164786b292527658ca1605/jdk-8u281-linux-x64.tar.gz?AuthParam=1614342179_659c3e77bffb9a532e2e87404c0c6647
, затем установите его:
sudo mkdir /usr/lib/jvm
mv 'jdk-8u281-linux-x64.tar.gz?AuthParam=1614342179_659c3e77bffb9a532e2e87404c0c6647' jdk-8u281-linux-x64.tar.gz
sudo tar xvf jdk-8u281-linux-x64.tar.gz -C /usr/lib/jvm
Добавьте java
и javac
кupdate-alternatives
:
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.8.0_281/bin/java" 100
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.8.0_281/bin/javac" 100
установить jdk1.8
по умолчанию:
sudo update-alternatives --set java /usr/lib/jvm/jdk1.8.0_281/bin/java
Проверьте это:
java -version
пример вывода:
java version "1.8.0_281"
Java(TM) SE Runtime Environment (build 1.8.0_281-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.281-b09, mixed mode)
Ребята, мне удалось решить эту проблему, добавив эту строку в мой sources.list:
debhttp://security.debian.org/debian-securityрастянуть/обновить основной а затем я выполнил эту команду:
apt-update
А потом это:
apt install openjdk-8-jdk
И, наконец, это:
sudo update-alternatives --config java
Затем просто выберите Java 8 и все, Java работает:)