rm -f
в команде find
- действительно плохая идея, если вы действительно не знаете, что делаете. \;
в конце команды tar
вызовет ошибку. ;
в команде find
. Он передается в качестве аргумента, чтобы сообщить find
, где находится конец переданной команды. tar
пытается извлечь из архива, а не создать его. / ~ /
не будут преобразованы оболочкой в имя вашего домашнего каталога; это происходит только в том случае, если ~
стоит в начале слова. find
можно будет объединить в одну команду. Я уверен, что есть еще кое-что; это просто не в моей голове. Покопайтесь здесь, на этом сайте, и вы сможете узнать очень много.
Мы рады помочь, но на самом деле это не сайт "помощи по домашнему заданию". Вы, вероятно, получите больше помощи, если продемонстрируете, что вы действительно хотите учиться, а не просто хотите выполнить домашнее задание.
Отправной точкой является эта строка sed:
$ echo 2011.06.26. v | sed 's/^\([0-9]\+\.[0-9]\+\.[0-9]\+\. \([hv]\|sze\)\)$/----------\n\1/'
----------
2011.06.26. v
Поскольку sed использует базовый синтаксис регулярных выражений (по умолчанию), вы должны экранировать символы ()|+
, чтобы получить их специальное значение (группировка, альтернатива, один или несколько). С помощью \1
вы делаете обратную ссылку на первое групповое совпадение.
Я нашел это решение, используя 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}}'
Недостаток в том, что дата должна быть сопоставлена дважды. Возможно, есть другое (лучшее) решение.
Результат получается именно таким, как ожидается в вашем примере.
Вы должны использовать 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}
означает: если мы не совпали с указанным выше, то для всех остальных строк (т. Е. Совпадение с началом строки, поэтому даже пустая строка будет сопоставлена ), просто распечатайте эту строку.
Другими словами, вы хотите вставить строку ----------
перед каждой строкой, содержащей дату 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
.