Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

to remove comments (start with # and /* comment */) in settings.php, below command is just works fine:

sed '/^\#/d' settings.php > outp.txt
mv outp.txt settings.php
sed '/\/\*/,/*\//d; /^\/\//d; /^$/d;' settings.php > outp2.txt
mv outp2.txt settings.php
sed '/^$/d' settings.php > outp3.txt
mv outp3.txt settings.php

But how to remove comments in all files including in subdirectories?

share|improve this question
FYI, you can use sed -i to do an in-place edit. Also, you are doing /^$/d twice. – grawity Mar 20 '11 at 8:15
thanks. I'm newbie in using sed. I will look into it – Juragan Kaskus Ngecrot Mar 20 '11 at 8:22
up vote 2 down vote accepted

Starting from the directory you wish to traverse you can f.e. use find ./ -type f -name '*.php' -print0 | xargs -0 sed -i '/^\#/d'. xargs builds the argument list for sed for better performance and the -i option of sed replaces the pattern in-place (you don't have to use redirection).

EDIT: According to the manpage of find find ./ -name '*.php' -type f -print0 | xargs -0 sed -i '/^\#/d' is even faster, because it doesn't call stat on every file (-type option).

share|improve this answer
You might prefer to use the -print0 parameter to find and use xargs -0 - this will append \000 (chr(0), ascii character 0, 0x00, call it what you will) after each filename, and tells xargs to expect that character as a filename delimiter. This allows you to cleanly handle filenames with spaces in them. – Majenko Mar 20 '11 at 9:04
Thank you very much! – p.vitzliputzli Mar 20 '11 at 9:08

You can sed 'in place' with -i. You can concat sed-commands with semicolons like this: 'c1;c2;c3' You can execute commands with find - no need for | xargs.

find ./somedir -name "*.php" -execdir sed -i '/^\#/d;/\/\*/,/*\//d; /^\/\//d; /^$/d;;/^$/d' {} + 

This works for gnu-find on linux; maybe your find doesn't have -execdir, -exec should work as well, and maybe it doesn't have +, then ";" would be a simple but not that fast solution, or using xargs as shown above by p.vitzliputzli with the improvement from Matt for filenames with whitespace and special characters is an alternative.

share|improve this answer

You can use Vim in Ex mode:

find -name '*.php' -exec ex -sc g/^#/d -cx {} ';'
  1. g global search

  2. d delete

  3. x save and close

share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .