How to use 'sed' with piping
Matthew Martinez
I want to replace a string outputted from grep, I have:
$ npm info webpack | grep version it outputs me
$ version: '2.1.0-beta.12',but I want to have:
$ 2.1.0-beta.12So I think I might achieve that using sed and replace unnecessary substrings. But here goes the hard part for me:
$ npm info webpack | grep version: | sed s/version: /
sed: -e expression #1, char 10: unterminated `s' commandHow can achieve my goal?
03 Answers
If you are going to use sed, there is no need to also use grep. Try:
npm info webpack | sed -En "s/version: '(.*)',/\1/p"Example:
$ echo "version: '2.1.0-beta.12'," | sed -En "s/version: '(.*)',/\1/p"
2.1.0-beta.12Alternative: using awk
Similarly, if we use awk, there is no need to also grep:
npm info webpack | awk -F"[ ',]+" '/version:/{print $2}'Example:
$ echo "version: '2.1.0-beta.12'," | awk -F"[ ',]+" '/version:/{print $2}'
2.1.0-beta.12How it works:
-F"[ ',]+"This tells awk to use spaces, single quotes, or commas or any combination thereof as field separators.
/version:/{print $2}If a line contains
version:, then print the second field.
The sed substitute command (s) expects a search pattern and a replacement string. You only supplied it with a search pattern. You also should quote strings properly in the shell:
$ npm info webpack | grep 'version:' | sed 's/version: //'This will give you the result '2.1.0-beta.12',, which is not quite what you want.
Since the output from grep is so simple, you may use cut with the delimiter ' to get the second field of the line (without the need for complicated regular expressions):
$ npm info webpack | grep -F 'version:' | cut -d "'" -f 2This will give you 2.1.0-beta.12.
I also added -F to grep since the string you search for is a fixed string, not a regular expression.
First, you may try using sed:
npm info webpack | grep version: | sed 's/version: //'or you may use awk:
npm info webpack | grep version: | awk '{print $2}'which is probably easier.