how to use xargs with sed in search pattern
Solution 1
Use command substitution instead, so your example would look like:
sed -i "s/$(echo "some pattern")/replacement/g" file.txt
The double quotes allow for the command substitution to work while preventing spaces from being split.
Solution 2
You need to tell xargs what to replace with the -I switch - it doesn't seem to know about the {} automatically, at least in some versions.
echo "pattern" | xargs -I '{}' sed -i 's/{}/replacement/g' file.txt
Solution 3
this works on Linux(tested):
find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g'
Solution 4
This might work for you (GNU sed):
echo "some pattern" | sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt
Essentially turn the some pattern
into a sed substitution command and feed it via a pipe to another sed invocation. The last sed invocation uses the -f
switch which accepts the sed commands via a file, the file in this case being the standard input -
.
If you are using bash, the here-string
can be employed:
<<<"some pattern" sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt
N.B. the sed separators |
and /
should not be a part of some pattern
otherwise the regexp will not be formed properly.
Related videos on Youtube
Comments
-
Neuquino almost 4 years
I need to use the output of a command as a search pattern in sed. I will make an example using echo, but assume that can be a more complicated command:
echo "some pattern" | xargs sed -i 's/{}/replacement/g' file.txt
That command doesn't work because "some pattern" has a whitespace, but I think that clearly illustrate my problem.
How can I make that command work?
Thanks in advance,
-
wyde19 almost 5 yearsIt's not what was asked. Author could've invented simplified example to better isolate the logic he asked about. Furthermore, this question is visited by the people searching how to use sed inside xargs specifically (because of the question title) and this does not provide answer to that.
-
geoidesic about 2 yearsAlso doesn't seem to work e.g.
sed -i "s/$(echo "grep 'A temporary password' /var/log/mysqld.log | grep --line-buffered -oE '.{0,0}localhost:.{0,13}.' | tail -c 13")/replacement/g" ./mysecure.exp