Сопоставление строк и извлечение содержимого за один раз

Необходимо исправить нужный файл.

Как вы его называете, он попытается исправить новый файл и, таким образом, правильно предполагает обратное исправление.

Попробуйте скопировать старую версию файла в текущий каталог, и патч будет применен.

Что касается теста -p0 : есть ли у вас разрешение на изменение/usr/bin/gradle? Есть ли у вас разрешение на создание файлов в/usr/bin?

Также обратите внимание, что существуют отклоняющиеся правила для исправления имени файла.

Правила, используемые gpatch , отличаются как от исходного патча, так и от стандарта патча POSIX.

Обратите внимание, что сообщение «not a regular file» специфично для gpatch . Перечислите файл /usr/bin/gradle . Сообщение печатается только тогда, когда файл не является обычным файлом, поэтому что-то выглядит странно.

Таким образом, решение состоит в том, что

patch исправляет только обычные файлы, но файл, который вы хотите исправить, является символической ссылкой.

Если у вас есть копия обычного файла (старой версии) в вашем текущем каталоге, патч будет делать то, что вы ожидаете.

BTW: обычным правилом получения имени файла для исправления является поиск кратчайшего имени, так как обычно используется правило именования:

file.orig

и

file

-121--111304-

Если оба файла являются текстовыми, можно использовать команду 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 что-либо, если это так, файлы отличаются и должны быть скопированы, в противном случае он просто копирует файл один.

-121--252322-

Должны работать:

sudo useradd -m -k /home/user1/ user2

, где -m говорит создать домашний каталог, а -k предоставляет каталог скелета для использовать.

1
09.04.2018, 11:48
4 ответа

Для используемого вами регулярного выражения, которое содержит ()без кавычек, требуется расширенный синтаксис регулярного выражения (или замените (и )на \(и\)). Это просто.

И, вероятно, избегайте жадного сопоставления, используя [^<]вместо точки.

Конечно, вы можете установить переменную и играть с кавычками, используя только 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
1
27.01.2020, 23:18

Возможное решение через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(^).

0
27.01.2020, 23:18

Правильный путь сxmlstarletинструментом (для разбора данных xml/html):

xmlstarlet sel -t -m '//h2' -v 'concat(., "'$'\t''",./following-sibling::p)' -n file

Выход:

Hello   World
Bells   Walls
Jelly   Minus
1
27.01.2020, 23:18

Использование синтаксического анализатора 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

Как вы можете видеть, только использование регулярного выражения не позволит получить все случаи, которые можно получить с помощью инструмента, специфичного для предметной области -. Если вы согласны с этим, то все в порядке; просто имейте в виду, что вы можете получить неточные результаты, если ввод не соответствует точно вашему шаблону!

2
27.01.2020, 23:18

Теги

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