While programming I often look for different objects and names across many projects. When I find desired files, I’d like to perform some operations on sub group of results. Lets say open 100 files but skipping first 5.

Lets start with just finding all *.java and *.xml files with foo and bar strings. Generally, my spell looks similar to this:

find . -iname '*.java' -o -iname '*.xml' | xargs grep -irl 'foo' | xargs grep -irl 'bar'

Then filtering

# filter
find . -iname '*.java' -o -iname '*.xml' | xargs grep -irl 'foo' | xargs grep -irl 'bar' | sed '5,105!d'

# open files with kwrite
find . -iname '*.java' -o -iname '*.xml' | xargs grep -irl 'foo' | xargs grep -irl 'bar' | sed '5,105!d' | xargs kwrite

Meaning of sed’s parameters:

  • 5 – take lines from 5th line
  • 105 – take lines to 105th line
  • ! – take everything except from 5th to 105th line
  • d – delete what you took and print everything else

Similarly, if you want to keep everything except 100 lines starting form 5th, then just drop ‘!’

find . -iname '*.java' -o -iname '*.xml' | xargs grep -irl 'foo' | xargs grep -irl 'bar' | sed '5,105d'

https://linux.die.net/man/1/sed
⤧  Next post .tar.gz — compress & uncompress ⤧  Previous post GIT — ignore file mode changes