Как использовать sed для записи в файл, имя которого хранится в переменной?

Я не знаю, управляет ли инициирование поддержек Xfce в нажатии и выпуске кнопок, но я, кажется, вспоминаю, что FVWM2 поддерживает это. Используя один сценарий для запуска записи и другого сценария для остановки его, это должно быть полностью возможно. arecord или parecord должен смочь сделать фактическую запись.

5
03.11.2015, 04:00
3 ответа

Поскольку вы используете одно выражение sed , все, что следует после w (включая } ), интерпретируется как wfile имя :

Аргумент wfile завершает команду редактирования.

Вы можете увидеть, что если вы добавите вторую команду } , например например:

sed -e '/my regex here/{w '"$file2"';d;}' -e '}' $file1

тогда строки, соответствующие моему регулярному выражению здесь , будут сохранены в файле с именем something; d;} где something is any $ file1 расширяется до.
Правильный синтаксис - через отдельные команды, либо с несколькими выражениями:

sed -e '/my regex here/{w '"$file1" -e 'd' -e '}' $file2

, либо по одной команде на строку:

sed '/my regex here/{
w '"$file1"'
d
}
' $file2
4
27.01.2020, 20:37

Используйте двойные кавычки вместо одиночных, чтобы заключить команду sed в кавычки. И не забудьте экранировать подходящие символы.

Дополнительная информация о цитировании переменных в bash по этой ссылке

-1
27.01.2020, 20:37

Я нашел ответ на Stackoverflow в разделе "Как дать команде sed 'w' знать, где заканчивается имя файла? "

Как указал terdon, проблема не в переменной - но и фигурные скобки тут ни при чем; попробуйте sed '/^l/w testing;p' и вы увидите, что он не выдает никакой ошибки, но записывает все строки, начинающиеся с l в файл с именем testing;p.

На самом деле проблема заключается в отсутствии новой строки после имени файла.

Поэтому ответ заключается в том, чтобы либо использовать встроенную новую строку в команде sed:

sed -i '/my regex here/{;w '"$file2"'
d;}' $file1

Или, что гораздо чище, использовать два отдельных аргумента -e:

sed -i -e '/my regex here/{;w '"$file2" -e 'd;}' $file1

Если вам не нравятся две смежные кавычки (которые вы можете легко пропустить), просто поместите команду write в собственный аргумент:

sed -i -e '/^my regex here$/{' -e "w $file2" -e 'd;}' $file1
4
27.01.2020, 20:37

Теги

Похожие вопросы