On Thu, Nov 29, 2018 at 11:04 AM Yagamy Light <[email protected]> wrote:

> I recently migrated my workflow from a mess that is grep, sed, and perl,
> all with different options, incompatible behavior and regexps, to just ack
> and perl¹.
>

Sounds familiar!
I resisted Perl, being happy with awk, grep, sed, find for years; I finally
moved to perl just as Perl 5.0 was supplanting Perl 4.0 back in the
early/mid 90s.

> I'm happy so far, but there's one thing I miss: ability for "ack" to
> execute a command on files with matches.
>
This can be worked around with xargs, e.g.:
>     ack -l --print0 pattern | xargs -r0 perl -i -pe
> 's/pattern/replacement/g'
>

*ack -[lgf] ... | xargs *is definitely a recommended pattern for ack.
(It will actually be *literally* recommended in the new Ack 3.0
documentation, coming soon !)

Unfortunately "xargs" is a limited workaround: it's kind of complex,
>

I wouldn't say it's limited. *xargs* is well worth the effort to get
proficient with so it rolls of the fingers.
Yes,it is different from old find(1); yes, it's taken this oldtime Unix
graybeard a while to get with it, but it's worth it.

It's way less complex and more flexible than old find -exec, and bonus of
it's interoperable with ack and most anything else that can stream stdout.

The separation of concerns is very much in the spirit of original Unix
Shell Pipelines "Do One Thing Well" to divide the work of (commonest uses
of)  find -exec
into ack -[lgf] ... | xargs .
Ack 3

(Caveat: This won't do everything find(1) did, e.g. ack doesn't do -newer
or link filtering.
ack's website BeyondGrep.com and coming cookbook document when to use
something else.
The corollary of "Do one thing well" is to not try to do everything.
(BSD and GNU-Tools have sometimes forgotten that ...)
There are definitely Ack-like tasks I still use Perl one-liners for; e.g.  -000
, -a $F[2] , //xism
)

FWIW, Ack supports the same separation of concerns for itself with the -fgx
options and has the same separation of concerns internally: Finding files
by delving through directories (and arguments/options) and then searching
text in files are in two different Perl Modules, and Andy is even working
on standardizing on different vocabulary for describing the two behaviors
(which I think I'm using correctly here).
(And Ack 3.0 will *require* separation into ack -g filepattern | ack -x
textpattern rather than having two PCRE's on one commandline as allowed,
confusingly, in ack 2.x.)


and I afraid it may break if it match number of files more than ARG_MAX
> xargs variable.
>

Do not fear.
If more than *-s max_chars(=128KiB or ARG_MAX)* is input, *xargs* will run
multiple commands, using no more than (not exactly)ARG_MAX chars on each.
https://linux.die.net/man/1/xargs


It would be great if "ack" instead supported an "--exec" option to execute
> a command on match.
>

With the impending release of Ack 3.0, I will guarantee this won't ever be
added to Ack 2.x -- we're currently debating which if any non-doc bugs are
worth fixing in 2.$LAST when adding the "This is the last release" to the
2.$LAST MAN page -- and won't be in Ack 3.0,
*but* 3.0 feature-freeze is pretty much perfect time to start lobbying for
3.1 killer features, so well timed in a way.

As a believer in the old "Do One Thing Well" mantra, i would argue against
such a change.

But Andy gets 60% of the votes so my discouragement is only advisory :-D.

P.S.: The "contributing" says I need to post the request here first.
>

Yes, it's always good to say hello here before trying a PULL request.
If Andy likes an idea here or is even open to considering it, he'll ask for
a feature-request bug-report.
(And it's good to know which queue to add it to ... bugs logged on Ack2
will almost certainly be WNF'd and maybe copied to Ack3, so any feature
requests should go on Ack3 now.)
(Which reminds me, i need to go find/update/write an issue  ...)

1: https://github.com/Hi-Angel/notes-backup/blob/master/perl.md
>

Very nice!  Thank you for publishing that and sharing.

Please feel free to link ack's homepage, BeyondGrep.com from there if you
like.

(If you haven't already noticed, ack switches to non-recursive implicitly
when you name specific files, e.g
   ack pattern *.pl *.pm *.t   # nonrecursive
vs
   ack pattern --perl   # recursive
.)

-- 
You received this message because you are subscribed to the Google Groups "ack 
users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/ack-users.
For more options, visit https://groups.google.com/d/optout.

Reply via email to