ram
ram

Reputation: 343

I want to edit a specific lines (multiple) with sed command

I have a test file having around 20K lines in that file I want to change some specific string in specific lines I am getting the line number and strings to change.here I have a scenario where I want to change the one string to another in multiple lines. I used earlier like

sed -i '12s/stringone/stringtwo/g'   filename

but in this case I have to run the multiple commands for same test like

sed -i '15s/stringone/stringtwo/g'   filename
sed -i '102s/stringone/stringtwo/g'   filename
sed -i '11232s/stringone/stringtwo/g'   filename

Than I tried below

sed -i '12,15,102,11232/stringone/stringtwo/g' filename

but I am getting the error

sed: -e expression #1, char 5: unknown command: `,'

Please some one help me to achieve this.

Upvotes: 2

Views: 1239

Answers (3)

potong
potong

Reputation: 58488

This might work for you (GNU sed):

sed '12ba;15ba;102ba;11232ba;b;:a;s/pattern/replacement/' file

For each address, branch to a common place holder (in this case :a) and do a substitution, otherwise break out of the sed cycle.

If the addresses were in a file:

sed 's/.*/&ba/' fileOfAddresses | sed -f - -e 'b;:a;s/pattern/replacement/' file 

Upvotes: 1

oliv
oliv

Reputation: 13259

You get the error because the N,M in sed is a range (from N to M) and doesn't apply to a list of single line number.

An alternative is to use printf and sed:

sed -i "$(printf '%ds/stringone/stringtwo/g;' 12 15 102 11232)" filename

The printf statement is repeating the pattern Ns/stringone/stringtwo/g; for all numbers N in argument.

Upvotes: 1

Ed Morton
Ed Morton

Reputation: 204239

To get the functionality you're trying to get with GNU sed would be this in GNU awk:

awk -i inplace '
BEGIN {
    split("12 15 102 11232",tmp)
    for (i in tmp) lines[tmp[i]]
}
NR in lines { gsub(/stringone/,"stringtwo") }
' filename

Just like with a sed script, the above will fail when the strings contain regexp or backreference metacharacters. If that's an issue then with awk you can replace gsub() with index() and substr() for string literal operations (which are not supported by sed).

Upvotes: 1

Related Questions