У меня есть файл данных, который я хочу запустить sed. Упрощенная версия файла test.data приведена ниже
test.data
=============
some text SEARCH_URL = "google.com" some ending text
Я хочу извлечь SEARCH_URL из этого без кавычек. После команды sed хорошо работает на подсказке bash
sed -n 's/^.*SEARCH_URL.*\"\(.*\)\".*/\1/p' ./test.data
Output
=============
google.com
Но команда не работает при вызове из скрипта python с check_output. Единственный вывод, который я получаю, - загадочная строка "\ x01\n"
geturl.py
=============
import subprocess
import re
#sed -n 's/^.*SEARCH_URL.*\"\(.*\)\".*/\1/p' test.data #works in bash
res = subprocess.check_output(["sed", "-n", 's/^.*SEARCH_URL.*\"\(.*\)\".*/\1/p', "test.data"]) print("Search URL is : ", res)
Это выводит результат как
python geturl.py
('Search URL is : ', '\x01\n')
Что мне не хватает?
Вы должны использовать необработанную строку, когда вы планируете каждую обратную косую черту в строковом литерале, чтобы обозначить буквенную обратную косую черту; в противном случае \1
в вашей 's/^.*SEARCH_URL.*\"\(.*\)\".*/\1/p'
будет интерпретироваться как символ порядкового номера 1, который равен '\x01
,
Изменить:
res = subprocess.check_output(["sed", "-n", 's/^.*SEARCH_URL.*\"\(.*\)\".*/\1/p', "test.data"])
чтобы:
res = subprocess.check_output(["sed", "-n", r's/^.*SEARCH_URL.*\"\(.*\)\".*/\1/p', "test.data"])