Jump to content
  • 0

передача grep path


Николя223
 Share

Question

Подскажите пожалуйста, как заставить grep передать дальше путь к файлу, 

grep -r "<item>" | xargs ...  то дальше греп передает то что он нашел, а не путь.   точно также если вместо xargs использовать -exec

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0

man grep
Флаг -l вероятно?

-l, --files-with-matches
	Only the names of files containing selected lines are written to standard output.  grep will only search a
    	file until a match has been found, making searches potentially less expensive.  Pathnames are listed once
    	per file searched.  If the standard input is searched, the string ``(standard input)'' is written.

 

  • Like 1
Link to comment
Share on other sites

  • 0

ага спс теперь не ругается
 

написал вот такое. наверно в регулярке косяк. просто этим sed не пользовался никогда, похоже sed не отрабатывает. 

find /test/www/*/www/ -type f -name "*.tpl" | xargs grep -l '<!-- items -->' | xargs sed -i  -r 's/(<!-- items  -->)(.*)(<!-- end items -->)/<!-- items_mark -->/g'

Link to comment
Share on other sites

  • 0

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

find /test/www/*/www/ -type f -name "*.tpl" | xargs grep -l '<!-- items -->' | xargs sed -i  -r 's/<!-- items -->.*<!-- end items -->/<!-- items_mark -->/g'

Link to comment
Share on other sites

  • 0
20 минут назад, Николя223 сказал:

как я понимаю sed работает построчно. попытаюсь на awk переделать

Мне кажется, проще написать скрипт, чем с командной строкой возиться :-)

Я знаю, что в Perl есть модификаторы \sm, который позволяют с multiline строкой работать.

То есть получиться что-то типа

# $html - сюда просто скормить весь файл сразу
$html =~ s{<!-- items -->.*?<!-- end items -->}{<!-- blablabla -->}smgi;

 

Edited by Igor Schnaider
Link to comment
Share on other sites

  • 0

Да. тоже думаю про перл или питон. 

но вот что получилось 

 find /test/www/*/www/ -type f -name "*.tpl" | xargs grep -l '<!-- items  -->' | xargs sed -i -r  '/<!-- items -->/,/<!-- end items -->/ { //!d }'

C заменой первой строки на метку пока не удалось, но так тоже пойдет.  - удаляет содержимое между метками

Ну и чтобы найти метки, если пространство между ними пусто, тоже можно грепом, 

Link to comment
Share on other sites

  • 0

Я немного увлекся :-) У меня вот такое получилось:

find . -type f -exec grep -li '<!-- items -->' {} \; | xargs perl rename.pl

И сам rename.pl:

#!/usr/bin/perl -w
use strict;

foreach my $filename (@ARGV) {
    # Skip the script itself
    next if $filename =~ m/$0$/;

    # Read
    open my $FH, "<", $filename or die "Error: $!\n";
        my $html = join("", <$FH>);
    close $FH;

    # Write
    open $FH, ">", $filename or die "Error: $!\n";
        $html =~ s{<!-- items -->.*?<!-- end items -->}{<!-- items_mark -->}smg;
        print $FH $html;
    close $FH;
}

 

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy