I want to replace
{not STRING }
with
(not STRING )
I ran
find . -maxdepth 1 -type f -exec sed -i -E 's/{not\s([^\s}] )\s}/(not \1 )/g' {} ;
It worked on some of the matches. When I run grep with the same pattern it shows more files that still have STRING. Ran find/sed again, same result.
CodePudding user response:
You need to escape curly braces ({}), as they are regex meta-characters. Also \s is not POSIX sed, I would use the more portable [[:space:]].
Your code did not work on the example text for me (GNU/Linux). This does:
sed -E 's/\{not[[:space:]] ([^[:space:]}] )[[:space:]] \}/(not \1 )/g'
I also allowed for variable length whitespace directly after not and directly before } (using [[:space:]] ). You may or may not want that.
Also:
- On MacOS sed I believe you need to supply a suffix argument to
-i. - The trailing
;for find-execmust be quoted (\;) to avoid interpretation by the shell.
So the command would be:
find . -maxdepth 1 -type f -exec \
sed -E -i .TMP 's/\{not[[:space:]] ([^[:space:]}] )[[:space:]] \}/(not \1 )/g' {} \;
If .TMP conflicts with an existing file, choose a different suffix.
