#bash #grep
#удар #grep
Вопрос:
У меня есть файлы 1.txt, 2.txt, 3.txt и 1-bis.txt, 2-bis.txt, 3-bis.txt
cat 1.txt #ok #5 6 5 cat 2.txt #not ok #56 13 56 cat 3.txt #nothing # cat 1-bis.txt 5 4 cat 2-bis.txt 32 24 cat 3-bis.txt
Я хотел бы добавить строки, начинающиеся с # (из файлов, отличных от bis), в начале файлов «bis», чтобы получить:
cat 1-bis.txt #ok #5 5 4 cat 2-bis.txt #not ok #56 32 24 cat 3-bis.txt #nothing #
Я думал использовать grep -P "#"
для выбора строк с # (или, может sed -n
быть), но я не знаю, как зациклить файлы, чтобы решить эту проблему
Большое вам спасибо за вашу помощь
Ответ №1:
Вы можете использовать это решение:
for f in *-bis.txt; do { grep '^#' "${f//-bis}"; cat "$f"; } gt; "$f.tmp" amp;amp; mv "$f.tmp" "$f" done
Если вам нужны только #
строки в начале файлов, используйте:
Изменить
grep '^#' "${f//-bis}"
с:
awk '!/^#/{exit}1' "${f//-bis}"
Комментарии:
1. Это добавит все строки , начинающиеся с
#
, даже если их нет в преамбулеN.txt
файла. Если это не то, что нужно оператору , вместоgrep '^#'
этого мы могли бы использоватьawk '!/^#/{exit}1'
, чтобы выбрать только первые строкиN.txt
, начиная с#
которых .2. @RenaudPacalet: Может быть, я неправильно понял, но ОП написал это:
I would like to add lines starting with # (from non bis files) at the beginning of files "bis"
именно это я и сделал в своем ответе.3. @anubhava Абсолютно, вы прекрасно ответили на вопрос (причина, по которой я проголосовал). Но поскольку во всех приведенных примерах есть
#
строки в начале файлов, возможно, эта дополнительная функция также требуется, и оператор забыл упомянуть об этом. Вот почему я прокомментировал это на всякий случай.4. Да, спасибо @RenaudPacalet, я добавил хорошее
awk
решение в свой ответ, как вы предложили.
Ответ №2:
Вы можете перебирать ?.txt
файлы и использовать расширение параметров для получения соответствующего bis — имени файла:
for file in ?.txt ; do bis=${file%.txt}-bis.txt grep '^#' "$file" gt; tmp cat "$bis" gt;gt; tmp mv tmp "$bis" done
Вам это не нужно grep -P
, достаточно простого grep. Просто добавьте ^
, чтобы совпадали только октоторпы в начале строки.