nobody
nobody

Reputation: 11

I want to pipe grep output to sed for input

I'm trying to pipe the output of grep to sed so it will only edit specific files. I don't want sed to edit something without changing it. (Changing the modified date.)

I'm searching with grep and writing with sed. That's it

The thing I am trying to change is a dash, not the normal type, a special type. "-" is normal. "–" isn't normal


The code I currently have:

sed -i 's/– foobar/- foobar/g' * ; perl-rename 's/– foobar/- foobar/' *'– foobar'*

Sorry about the trouble, I'm inexperienced.

Upvotes: 0

Views: 4298

Answers (3)

nobody
nobody

Reputation: 11

Thank you all for helping, I'm sorry about not being fast in responding

After a bit of fiddling with the command, I got it:

grep -l 'old' * | xargs -d '\n' sed -i 's/old/new/'

This should only touch files that contain old and leave all other files.

Upvotes: 1

Ed Morton
Ed Morton

Reputation: 203189

This might be what you're trying to do if your file names don't contain newlines:

grep -l -- 'old' * | xargs sed -i 's/old/new/'

Upvotes: 0

Dominique
Dominique

Reputation: 17493

Are you sure about what you want to achieve? Let me explain you:

grep "string_in_file" <filelist> | sed <sed_script>

This is first showing the "string_in_file", preceeded by the filename.
If you launch a sed on this, then it will just show you the result of that sed-script on screen, but it will not change the files itself. In order to do this, you need the following:

grep -l "string_in_file" <filelist> | sed <sed_script_on_file>

The grep -l shows you some filenames, and the new sed_script_on_file needs to be a script, reading the file, and altering it.

Upvotes: 1

Related Questions