используя grep и sed, нужно заполнить всю версию из файла [duplicate]

Обычно код javascrypt имеет глобальную область действия приложения. Когда мы объявляем глобальную переменную в нем, есть шанс использовать ту же повторяющуюся переменную в какой-то другой области разработки для какой-либо другой цели. Из-за этого дублирования может произойти некоторая ошибка. Таким образом, мы можем избежать этих глобальных переменных, используя сразу вызывающее выражение функции, это выражение является самоисполняющимся выражением. Когда мы делаем наш код внутри этого выражения IIFE, глобальная переменная будет похожа на локальную область и локальную переменную.

Two мы можем создать IIFE

(function () {
    "use strict";
    var app = angular.module("myModule", []);
}());

ИЛИ

(function () {
    "use strict";
    var app = angular.module("myModule", []);
})();

В приведенном выше фрагменте кода « var app » теперь является локальной переменной.

33
задан amarillion 8 February 2010 в 15:34
поделиться

9 ответов

Вам действительно нужно использовать только те инструменты? Они не предназначены для обработки XML, и хотя можно получить что-то, что работает нормально большую часть времени, оно не будет работать в крайних случаях, таких как кодирование, разрывы строк и т. Д.

Я рекомендую xml_grep:

xml_grep 'job' jobs.xml --text_only

Что дает результат:

programming

В ubuntu / debian xml_grep находится в пакете xml-twig-tools.

55
ответ дан amarillion 22 August 2018 в 08:23
поделиться
  • 1
    Тесные инструкции по установке были бы хороши для xml_grep – paul_h 1 April 2017 в 11:41
  • 2
    sudo apt-get install xml-twig-tools – FredFury 25 July 2017 в 08:35
  • 3
    & Quot; Grep & Quot; является просто синонимом безболезненного поиска текста. – dr0i 2 July 2018 в 10:42

Предполагая ту же строку, ввод из stdin:

sed -ne '/<\/job>/ { s/<[^>]*>\(.*\)<\/job>/\1/; p }'

отмечает: -n останавливает его вывод всего автоматически; -e означает, что это однострочный (aot скрипт) /<\/job> действует как grep; s удаляет атрибуты opentag + и endtag; ; - новое утверждение; p печатает; {} делает grep применимым к обоим утверждениям как к одному.

4
ответ дан 13ren 22 August 2018 в 08:23
поделиться

Как насчет:

cat a.xml | grep '<job' | cut -d '>' -f 2 | cut -d '<' -f 1
0
ответ дан codaddict 22 August 2018 в 08:23
поделиться
  • 1
    UUOC. grep '<job' a.xml | ... – ghostdog74 9 February 2010 в 00:53
  • 2
    @ghost , но, но, я думаю, что это чище / лучше / не так много отходов / моего privelege для отходов! partmaps.org/era/unix/award.html#cat (на самом деле, я думаю, что изменить имя файла проще, потому что ближе к началу) – 13ren 10 February 2010 в 13:13
  • 3
    Если вы используете < a.xml | grep ..., вы становитесь еще ближе к началу. – Thor 23 August 2012 в 14:11

просто используйте awk, не нужно использовать другие внешние инструменты. Ниже работает, если ваши нужные теги отображаются в мультитине.

$ cat file
test
<job xmlns="http://www.sample.com/">programming</job>
<job xmlns="http://www.sample.com/">
programming</job>

$ awk -vRS="</job>" '{gsub(/.*<job.*>/,"");print}' file
programming

programming
7
ответ дан ghostdog74 22 August 2018 в 08:23
поделиться
  • 1
    </ job> действительно, но ваш скрипт не распознает его. <!-- </job> --> - комментарий, который нужно игнорировать (и <!CDATA[[ </job> ]]> - это литеральные данные), но ваш скрипт не знает , что . И тогда есть такие случаи, как DTD, который определяет новые макросы, так что &foo; расширяется до локального значения, а простые случаи, такие как необходимость конвертировать &amp; в &. Попытка перевернуть собственный анализ XML (или, что еще хуже, поколение) приводит к тому, что не будут завершаться угловые случаи и небольшие детали, которые необходимо индивидуально пропустить и зафиксировать. – Charles Duffy 25 September 2017 в 14:28

Использование xmlstarlet:

echo '<job xmlns="http://www.sample.com/">programming</job>' | \
   xmlstarlet sel -N var="http://www.sample.com/" -t -m "//var:job" -v '.'
7
ответ дан lmxy 22 August 2018 в 08:23
поделиться
  • 1
    Существует значительное количество различных инструментов, которые используют стандартную нотацию XPath для извлечения информации из XML - xmlstarlet - это всего лишь один. Другие включают xmllint, xpath и т. Д. См. stackoverflow.com/questions/15461737/… – tripleee 10 June 2015 в 07:28

Немного поздно для показа.

xmlcutty вырезает узлы из XML:

$ cat file.xml
<?xml version="1.0" encoding="utf-8"?>
<job xmlns="http://www.sample.com/">programming</job>
<job xmlns="http://www.sample.com/">designing</job>
<job xmlns="http://www.sample.com/">managing</job>
<job xmlns="http://www.sample.com/">teaching</job>

Аргумент path называет путь к элемент, который вы хотите вырезать. В этом случае, поскольку мы вообще не интересуемся тегами, мы переименовываем тег в \n, поэтому получаем хороший список:

$ xmlcutty -path /job -rename '\n' file.xml
programming
designing
managing
teaching

Обратите внимание, что XML недействителен для начните с (нет корневого элемента). xmlcutty может работать и со сломанным XML.

0
ответ дан miku 22 August 2018 в 08:23
поделиться

Пожалуйста, не используйте синтаксический анализ на основе строк и регулярных выражений в XML. Это плохая идея. Вы можете иметь семантически идентичный XML с различным форматированием, а регулярное выражение и анализ на основе строк просто не могут справиться с ним.

Такие вещи, как унарные теги и перенос переменных строк - эти фрагменты «говорят» одно и то же:

<root>
  <sometag val1="fish" val2="carrot" val3="narf"></sometag>
</root>


<root>
  <sometag
      val1="fish"
      val2="carrot"
      val3="narf"></sometag>
</root>

<root
><sometag
val1="fish"
val2="carrot"
val3="narf"
></sometag></root>

<root><sometag val1="fish" val2="carrot" val3="narf"/></root>

Надеюсь, это дает понять, почему создание парсера с регулярным выражением / линией затруднено ? К счастью, вам не нужно. Многие языки сценариев имеют как минимум один, а иногда и более синтаксический анализ.

Как уже упоминался предыдущий плакат - xml_grep. Это инструмент, основанный на библиотеке XML::Twig perl. Однако то, что он делает, это использовать выражения «xpath», чтобы найти что-то и различать структуру документа, атрибуты и «контент».

Например:

xml_grep 'job' jobs.xml --text_only

Однако в интересах получения более качественных ответов, вот несколько примеров «сворачивать свои собственные» на основе ваших исходных данных:

Первый способ:

Используйте twig handlers, который захватывает элементы определенного типа и действует на них. Преимущество этого метода заключается в том, что он анализирует XML «как вы идете» и позволяет вам изменять его в полете, если вам нужно. Это особенно полезно для отбрасывания «обработанного» XML, когда вы работаете с большими файлами, используя purge или flush:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

XML::Twig->new(
    twig_handlers => {
        'job' => sub { print $_ ->text }
    }
    )->parse( <> );

, которые будут использовать <> для ввода ввода (в , или задается с помощью командной строки ./myscript somefile.xml) и обрабатывать его - каждый элемент job, он будет извлекать и распечатывать любой связанный текст. (Возможно, вы захотите print $_ -> text,"\n" вставить строку перевода).

Поскольку он совпадает с элементами «задания», он также будет соответствовать на вложенных элементах задания:

<job>programming
    <job>anotherjob</job>
</job>

будет совпадать дважды, но дважды напечатать часть вывода. Однако, если вы предпочитаете, вы можете выбрать /job. Использование - это позволяет вам, например. распечатать и удалить элемент или скопировать и вставить одно изменение структуры XML.

Альтернативно - сначала проанализируйте и «напечатайте» на основе структуры:

my $twig = XML::Twig->new( )->parse( <> );
print $twig -> root -> text;

Поскольку job является вашим корневым элементом, все, что нам нужно, это распечатать его текст.

Но мы можем быть немного более проницательными и искать job или /job и печатать, что специально вместо этого:

my $twig = XML::Twig->new( )->parse( <> );
print $twig -> findnodes('/job',0)->text;

Вы можете использовать XML::Twig s pretty_print, чтобы переформатировать ваш XML тоже:

XML::Twig->new( 'pretty_print' => 'indented_a' )->parse( <> ) -> print;

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

9
ответ дан Sobrique 22 August 2018 в 08:23
поделиться
 grep '<job' file_name | cut -f2 -d">"|cut -f1 -d"<"
12
ответ дан Vijay 22 August 2018 в 08:23
поделиться
  • 1
    только если он не работает, если теги находятся на отдельных строках – ghostdog74 9 February 2010 в 00:53
  • 2
    Существует около дюжины других способов, которые хорошо сформированный XML может привести к сбою. – Robert Rossney 9 February 2010 в 04:10

Использование команды sed:

Пример:

$ cat file.xml
<note>
        <to>Tove</to>
                <from>Jani</from>
                <heading>Reminder</heading>
        <body>Don't forget me this weekend!</body>
</note>

$ cat file.xml | sed -ne '/<heading>/s#\s*<[^>]*>\s*##gp'
Reminder

Объяснение:

cat file.xml | sed -ne '/<pattern_to_find>/s#\s*<[^>]*>\s*##gp'

n - подавить печать всех строк e - script

/<pattern_to_find>/ - находит строки, содержащие указанный шаблон, что может быть, например, <heading>

next - это замещающая часть s///p, который удаляет все, кроме желаемого значения, где / заменяется на # для лучшей читаемости:

s#\s*<[^>]*>\s*##gp \s* - включает белые пробелы, если они существуют (то же самое в конце) <[^>]*> представляет <xml_tag> как альтернативную альтернативу нерегулярному регулярному выражению <.*?> не работает для sed g - заменяет все, например, закрытие тега xml </xml_tag>

2
ответ дан vldbnc 22 August 2018 в 08:23
поделиться
Другие вопросы по тегам:

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