sed ведет себя по-разному при получении скрипта из файла - PullRequest
2 голосов
/ 15 апреля 2019

Мне нужно извлечь строки, которые могут содержать последовательность \n из файла.
Обратите внимание, что в этом случае \n - это не перевод строки, а просто последовательность из двух символов:обратная косая черта, за которой следует нижний регистр n.
Например, если я наберу:

echo garbage "useful \n string" garbage | sed -e s/.*\(\"[^\"]*\"\).*/\1/

, результат будет правильным:

"useful \n string"  

Если вместо этого я сохранювведите команду sed в файл (b.txt) и введите:

 echo garbage "useful \n string" garbage | sed -f b.txt

, что должно сделать то же самое, вместо этого я не вижу соответствия, и результат:

garbage "useful \n string" garbage  

Обратите внимание, что файл содержит только команду sed;входная строка, все еще приходит из стандартного ввода.

Я использую GNU sed версии 4.2.1 в окне командной строки Windows 10.
Есть предложения?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2019

Ваши последовательности цитирования и escape выглядят подозрительно, попробуйте это:

$ echo 'garbage "useful \n string" garbage' | sed 's/.*\("[^"]*"\).*/\1/'
"useful \n string"
$ cat b.txt
s/.*\("[^"]*"\).*/\1/
$ echo 'garbage "useful \n string" garbage' | sed -f b.txt
"useful \n string"
0 голосов
/ 16 апреля 2019

используйте пару '' и "" правильно и -E вместо опции -e в gnu sed,

$ echo 'garbage "useful \n string" garbage' | sed -E 's/.*("[^"]*").*/\1/'
"useful \n string"

$ cat b.txt
s/.*("[^"]*").*/\1/

$ echo 'garbage "useful \n string" garbage' | sed -Ef b.txt
"useful \n string"
...