Регулярное выражение Sed - включить исходное соответствие

  1. Если это домашнее задание, так и скажите.
  2. Ваш сценарий выполняет поиск только в текущем каталоге, независимо от того, какое имя каталога вы ему дали.
  3. Скрипт rm -f в команде find - действительно плохая идея, если вы действительно не знаете, что делаете.
  4. \; в конце команды tar вызовет ошибку.
  5. Судя по пункту 4, вы, похоже, не понимаете роли ; в команде find . Он передается в качестве аргумента, чтобы сообщить find , где находится конец переданной команды.
  6. Ваша команда tar пытается извлечь из архива, а не создать его.
  7. Ваши переменные не цитируются .
  8. / ~ / не будут преобразованы оболочкой в ​​имя вашего домашнего каталога; это происходит только в том случае, если ~ стоит в начале слова.
  9. Если вы все сделаете правильно, все три команды find можно будет объединить в одну команду.
  10. Я уверен, что есть еще кое-что; это просто не в моей голове. Покопайтесь здесь, на этом сайте, и вы сможете узнать очень много.

    Мы рады помочь, но на самом деле это не сайт "помощи по домашнему заданию". Вы, вероятно, получите больше помощи, если продемонстрируете, что вы действительно хотите учиться, а не просто хотите выполнить домашнее задание.

0
10.06.2011, 21:36
4 ответа

Отправной точкой является эта строка sed:

$ echo 2011.06.26. v | sed 's/^\([0-9]\+\.[0-9]\+\.[0-9]\+\. \([hv]\|sze\)\)$/----------\n\1/'
----------
2011.06.26. v

Поскольку sed использует базовый синтаксис регулярных выражений (по умолчанию), вы должны экранировать символы ()|+, чтобы получить их специальное значение (группировка, альтернатива, один или несколько). С помощью \1 вы делаете обратную ссылку на первое групповое совпадение.

2
29.04.2021, 00:59

Я нашел это решение, используя sed:

sed -n '/^[0-9]\{4\}\.[01][0-9]\.[0123][0-9]\./,${:a;N;$!ba;{s/\([0-9]\{4\}\.[01][0-9]\.[0123][0-9]\.\)/--------------\n\1/g;p}}'

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

0
29.04.2021, 00:59

Вы должны использовать awk вместо

awk '/ [0-9] {4} \. [0-9] {2} \. [0-9] {2} \. / {print "--------------------- \ n" $ 0; continue} / ^ / {print $ 0} '<"INPUTFILE"> "OUTPUTFILE"

в основном это работает в 2 этапа:

step1: / [0-9] {4} \. [0- 9] {2} \. [0-9] {2} \. / {print "--------------------- \ n" $ 0; continue}

означает: если он кэширует /4digits.2digits.2digits. / затем выведите «---...-- \ n», за которым следует соответствующая строка, и выполните цикл на следующей строке (= «продолжить»).

step2: / ^ / {print $ 0}

означает: если мы не совпали с указанным выше, то для всех остальных строк (т. Е. Совпадение с началом строки, поэтому даже пустая строка будет сопоставлена ), просто распечатайте эту строку.

0
29.04.2021, 00:59

Другими словами, вы хотите вставить строку ---------- перед каждой строкой, содержащей дату YYYY.MM.DD, за которой следует пробел и куча строчных букв. Есть несколько способов сделать это. Вы можете использовать команду insert (i):

sed -e '/^[0-9][0-9][0-9][0-9]\.[0-9][0-9]\.[0-9][0-9] [a-z][a-z]*$/ i \
----------'

Или вы можете заменить пустую строку в начале строки на новую строку.

sed -e '/^[0-9][0-9][0-9][0-9]\.[0-9][0-9]\.[0-9][0-9] [a-z][a-z]*$/ s/^/----------\
'

Или вы можете использовать & в тексте замены команды s для обозначения совпадающего шаблона.

sed -e 's/^[0-9][0-9][0-9][0-9]\.[0-9][0-9]\.[0-9][0-9] [a-z][a-z]*$/----------\
&'

Некоторые реализации sed позволяют писать \n вместо backslash-newline в тексте замены, но в других \n печатает \n или n.

0
29.04.2021, 00:59

Теги

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