Home > Enterprise >  sed replace line by escaping special chars
sed replace line by escaping special chars

Time:03-08

I am trying to replace lines using sed, and usually this works fine, but I am now encountering a string which does not seem to play ball with sed :(

file: test.py

$ cat test.py
BASE_DIR = os.path.expanduser("~/.teststring/")

I replace this line using:

sed -i '/BASE_DIR = os.path.expanduser("~/.paddleocr/")/c\BASE_DIR = os.path.expanduser("/tmp/.teststring/")' test.py

I get:

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

Not sure what is causing this. I tried escaping the . using \. but this does not help either :(

CodePudding user response:

Using sed 's/PATTERN/REPLACEMENT/', here is my proposed modified command:

sed -i 's#\(BASE_DIR = os.path.expanduser("\)~/.teststring/\(")\)#\1/tmp.teststring/\2#' test.py.NEW
  • uses the 's///' command.
  • in s///, the / character can be replaced by another one, to avoid confusion. Like in this particular case, you process files and paths, so I like to use # instead of / for the s/// separator. Hence s###.

PATTERN: \(BASE_DIR = os.path.expanduser("\)~/.teststring/\(")\). It is divided in 3 sections:

  •      1) \(BASE_DIR = os.path.expanduser("\). This part does not change so I enclosed it in \(\) to reuse it later. Parenthesis that are not part of the pattern must be "backslashed".
  •      2) ~/.teststring/. This part will change, it is the part of the line that you want matched from the original file.
  •      3) \(")\): closing double-quote and parenthesis, this does not change. Enclosed in \(\) to reuse it later.

REPLACEMENT: \1\/tmp.teststring/\2.

  •      i) \1 is the first part I "saved" for later reuse in no1) above.
  •      ii) /tmp.teststring/ the new text to replace the text from no2) above.
  •      iii) \2 is the second part I "saved" for later reuse in no3) above.

One detail I could not understand, your test.py file uses path "~/.teststring/", yet you tried to match it with "~/.paddleocr/". I guess that was a mistake?

CodePudding user response:

I think your first " should be a '

Also, you need to escape the \ which aren't part of the sed syntax e.g.:

sed -i '/BASE_DIR = os.path.expanduser("~\/.paddleocr\/")/c\\BASE_DIR = os.path.expanduser("\/tmp\/.teststring/")' test.py
  • Related