Необходимо исправить нужный файл.
Как вы его называете, он попытается исправить новый файл и, таким образом, правильно предполагает обратное исправление.
Попробуйте скопировать старую версию файла в текущий каталог, и патч будет применен.
Что касается теста -p0
: есть ли у вас разрешение на изменение/usr/bin/gradle?
Есть ли у вас разрешение на создание файлов в/usr/bin?
Также обратите внимание, что существуют отклоняющиеся правила для исправления имени файла.
Правила, используемые gpatch
, отличаются как от исходного патча, так и от стандарта патча POSIX.
Обратите внимание, что сообщение «not a regular file» специфично для gpatch
. Перечислите файл /usr/bin/gradle
. Сообщение печатается только тогда, когда файл не является обычным файлом, поэтому что-то выглядит странно.
Таким образом, решение состоит в том, что
patch
исправляет только обычные файлы, но файл, который вы хотите исправить, является символической ссылкой.
Если у вас есть копия обычного файла (старой версии) в вашем текущем каталоге, патч будет делать то, что вы ожидаете.
BTW: обычным правилом получения имени файла для исправления является поиск кратчайшего имени, так как обычно используется правило именования:
file.orig
и
file
Если оба файла являются текстовыми, можно использовать команду diff
.
FILE_ONE=/home/file_one.txt
FILE_TWO=/home/file_two.txt
if [ -n "$(diff $FILE_ONE $FILE_TWO)" ];then
cp $FILE_ONE /new_place/
cp $FILE_TWO /new_place/
else
cp $FILE_ONE /new_place/
fi
Проверяется, возвращает ли diff
что-либо, если это так, файлы отличаются и должны быть скопированы, в противном случае он просто копирует файл один.
Должны работать:
sudo useradd -m -k /home/user1/ user2
, где -m говорит создать домашний каталог, а -k предоставляет каталог скелета для использовать.
Для используемого вами регулярного выражения, которое содержит ()
без кавычек, требуется расширенный синтаксис регулярного выражения (или замените (
и )
на \(
и\)
). Это просто.
И, вероятно, избегайте жадного сопоставления, используя [^<]
вместо точки.
Конечно, вы можете установить переменную и играть с кавычками, используя только sed:
$ a='<h2>([^<]*)<\/h2><p>([^<]*)<\/p>'
$ sed -nE '/'"$a"'/s/'"$a"'/\1 \2/p' infile
Но это становится лучше, поскольку это можно упростить. Sed запоминает последнее использовавшееся регулярное выражение, и левой частиs//
(пусто )достаточно.
$ sed -nE '/'"$a"'/s//\1 \2/p' infile
Или, без переменной:
$ sed -nE '/<h2>([^<]*)<\/h2><p>([^<]*)<\/p>/s//\1 \2/p' infile
Hello World
Bells Walls
Jelly Minus
Возможное решение черезsed
:
sed 's/<[^13>]*>/ /g' test | sed 's/<h[13]>.*<\/h[13]>//' <file>
Hello World
Bells Walls
Jelly Minus
Второй sed
просто удаляет ненужные теги(<h1>
или <h3>
).
Объяснение шаблона:
/<[^13>]*>/ /
-поиск любых *
символов в тексте, который начинается с <
и заканчивается >
. Но между тегами не должно быть символов 1
или3
(^
).
Правильный путь сxmlstarlet
инструментом (для разбора данных xml/html):
xmlstarlet sel -t -m '//h2' -v 'concat(., "'$'\t''",./following-sibling::p)' -n file
Выход:
Hello World
Bells Walls
Jelly Minus
Использование синтаксического анализатора XML — действительно хорошая идея, но если вы не можете его использовать по какой-либо причине, (файл неправильно -сформирован, у вас не установлены какие-либо синтаксические анализаторы и т. д. )], вы можете использовать для этого PERL:
$ perl -ne 'if(/<h2>(.*?)<\/h2><p>(.*?)<\/p>/){print "$1\t$2\n"}' filename.ext
Hello World
Bells Walls
Jelly Minus
Я предпочитаю использовать ленивые совпадения, чтобы не получить непредвиденных результатов:
test.txt
<h1>Nothing</h1>
<h2>Hello</h2><p>World</p><h2>Goodbye</h2><p>Earth</p>
<h2>Bells</h2><p>Walls</p>
<h2>Jelly</h2><p>Minus</p>
<h3>Zip</h3>
$ perl -ne 'if(/<h2>(.*?)<\/h2><p>(.*?)<\/p>/){print "$1\t$2\n"}' test.txt
Hello World
Bells Walls
Jelly Minus
$ perl -ne 'if(/<h2>(.*)<\/h2><p>(.*)<\/p>/){print "$1\t$2\n"}' test.txt
Hello</h2><p>World</p><h2>Goodbye Earth
Bells Walls
Jelly Minus
Как вы можете видеть, только использование регулярного выражения не позволит получить все случаи, которые можно получить с помощью инструмента, специфичного для предметной области -. Если вы согласны с этим, то все в порядке; просто имейте в виду, что вы можете получить неточные результаты, если ввод не соответствует точно вашему шаблону!