sed - "unknown command" 用文件内容替换模式时
sed - "unknown command" when replacing pattern with contents of file
我尝试操作一些“模板化”文本文件。这意味着文件包含一些“令牌”,需要用一些实际字符串替换 - 硬编码或可从其他文件读取。
我有以下两行:
sed -r -e 's_<!-- cssintern -->_<style type="text/css">\n<!-- cssintern -->\n</style>\n_' -i "$out_dir_aca/books_1by1/independent/$(basename "$aca_frag").html"
sed -e '^<!-- cssintern -->^' -e '{r '"$src_dir_frags_struct/styles1.css.frag" -e 'd}' -i "$out_dir_aca/books_1by1/independent/$(basename "$aca_frag").html"
第一个工作正常。问题是第二个生成一个“未知命令”错误,我 运行 不知道如何修复它。调试输出如下(最后一行的错误文本):
+ for aca_frag in $out_dir_aca/frags_1by1/*
+ '[' -f '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag' ']'
++ basename '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag'
+ echo ' 09.14 - Acatistul inaltarii Sfintei Cruci.frag'
09.14 - Acatistul inaltarii Sfintei Cruci.frag
+ cat '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/1_txt_in/##_frags_struct_##/doctypeXHTML.frag'
++ basename '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag'
+ cat '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/1_txt_in/##_frags_struct_##/head.frag'
++ basename '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag'
+ cat '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/1_txt_in/##_frags_struct_##/foot.frag'
++ basename '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag'
++ basename '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag'
+ sed -r -e 's_<!-- cssintern -->_<style type="text/css">\n<!-- cssintern -->\n</style>\n_' -i '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/books_1by1/independent/09.14 - Acatistul inaltarii Sfintei Cruci.frag.html'
++ basename '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag'
+ sed -re '^<!-- cssintern -->^' -re '{r /home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/1_txt_in/##_frags_struct_##/styles1.css.frag' -re 'd}' -i '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/books_1by1/independent/09.14 - Acatistul inaltarii Sfintei Cruci.frag.html'
sed: -e expression #1, char 1: unknown command: `^'
我使用了分隔符 ^
、_
、/
,我用单引号和双引号的“所有”方式演奏,以及我在互联网上找到的所有其他内容.错误仍然存在的事实没有任何改变。
以前我用过这条线
sed.exe -i -e '/%%H/{r ..\/##_frags_##\/out\/%%H' -e 'd}' .\out\out.frag
在 Windows cmd
脚本中,并且运行良好。 (%%H
引用文件的名称,当解析文件夹中的所有文件时带有 for
)。我实际上正在重写 Linux 中的旧脚本作为练习 - 希望能增加简单性和额外的功能。
我打算改编以下 sed
命令:
sed -e '/<TEXT1>/{r File1' -e 'd}' -i File2
满足我的特殊需求。
注意:我提供了确切的文件名和路径,认为它们可能会提供一些见解。
注意:我在虚拟机中使用Debian 10.7。
注意:脚本文件以#!/bin/bash -xv
开头。 -xv
很明显只有在调试的时候才会用到,否则就没了。
The syntax is(评论我的):
[2addr] {editing command # No newline between '[2addr]' and '{'!
editing command
...
}
其中 [2addr]
例如 /filtering/
表达式。选项 -e
确实(强调我的):
If any -e or -f options are specified, the script of editing commands shall initially be empty. The commands specified by each -e or -f option shall be added to the script in the order specified. When each addition is made, if the previous addition (if any) was from a -e option, a <newline> shall be inserted before the new addition. The resulting script shall have the same properties as the script operand, described in the OPERANDS section.
当[2addr]
和{
之间有一个换行符时脚本无效:
$ sed -e '/something/' -e '{' -e '}' /dev/null
sed: -e expression #1, char 11: missing command
$ sed '
/something/
{
}' /dev/null
sed: -e expression #1, char 13: unknown command: `
'
将 {
与 [2addr]
放在一起修复了问题,因为它删除了换行符:
$ sed -e '/somethimg/{' -e '}' /dev/null
所以加上过滤表达式:
sed
-e '\^<!-- cssintern -->^{'
# ^^ ^^ here '{' is with /expression/
# or just: -e '/<!-- cssintern -->/{'
-e 'r blabla/styles1.css.frag'
-e d
-e '}' -i 'blabla/12.17 - Acatistul Sfantului Proroc Daniel.frag.html'
应该没问题。
我尝试操作一些“模板化”文本文件。这意味着文件包含一些“令牌”,需要用一些实际字符串替换 - 硬编码或可从其他文件读取。
我有以下两行:
sed -r -e 's_<!-- cssintern -->_<style type="text/css">\n<!-- cssintern -->\n</style>\n_' -i "$out_dir_aca/books_1by1/independent/$(basename "$aca_frag").html"
sed -e '^<!-- cssintern -->^' -e '{r '"$src_dir_frags_struct/styles1.css.frag" -e 'd}' -i "$out_dir_aca/books_1by1/independent/$(basename "$aca_frag").html"
第一个工作正常。问题是第二个生成一个“未知命令”错误,我 运行 不知道如何修复它。调试输出如下(最后一行的错误文本):
+ for aca_frag in $out_dir_aca/frags_1by1/*
+ '[' -f '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag' ']'
++ basename '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag'
+ echo ' 09.14 - Acatistul inaltarii Sfintei Cruci.frag'
09.14 - Acatistul inaltarii Sfintei Cruci.frag
+ cat '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/1_txt_in/##_frags_struct_##/doctypeXHTML.frag'
++ basename '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag'
+ cat '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/1_txt_in/##_frags_struct_##/head.frag'
++ basename '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag'
+ cat '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/1_txt_in/##_frags_struct_##/foot.frag'
++ basename '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag'
++ basename '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag'
+ sed -r -e 's_<!-- cssintern -->_<style type="text/css">\n<!-- cssintern -->\n</style>\n_' -i '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/books_1by1/independent/09.14 - Acatistul inaltarii Sfintei Cruci.frag.html'
++ basename '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/frags_1by1/09.14 - Acatistul inaltarii Sfintei Cruci.frag'
+ sed -re '^<!-- cssintern -->^' -re '{r /home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/1_txt_in/##_frags_struct_##/styles1.css.frag' -re 'd}' -i '/home/vici/Dropbox/MyFiles/work/___rug/_!_workarea/2_txt_out/aca/books_1by1/independent/09.14 - Acatistul inaltarii Sfintei Cruci.frag.html'
sed: -e expression #1, char 1: unknown command: `^'
我使用了分隔符 ^
、_
、/
,我用单引号和双引号的“所有”方式演奏,以及我在互联网上找到的所有其他内容.错误仍然存在的事实没有任何改变。
以前我用过这条线
sed.exe -i -e '/%%H/{r ..\/##_frags_##\/out\/%%H' -e 'd}' .\out\out.frag
在 Windows cmd
脚本中,并且运行良好。 (%%H
引用文件的名称,当解析文件夹中的所有文件时带有 for
)。我实际上正在重写 Linux 中的旧脚本作为练习 - 希望能增加简单性和额外的功能。
我打算改编以下 sed
命令:
sed -e '/<TEXT1>/{r File1' -e 'd}' -i File2
满足我的特殊需求。
注意:我提供了确切的文件名和路径,认为它们可能会提供一些见解。
注意:我在虚拟机中使用Debian 10.7。
注意:脚本文件以#!/bin/bash -xv
开头。 -xv
很明显只有在调试的时候才会用到,否则就没了。
The syntax is(评论我的):
[2addr] {editing command # No newline between '[2addr]' and '{'!
editing command
...
}
其中 [2addr]
例如 /filtering/
表达式。选项 -e
确实(强调我的):
If any -e or -f options are specified, the script of editing commands shall initially be empty. The commands specified by each -e or -f option shall be added to the script in the order specified. When each addition is made, if the previous addition (if any) was from a -e option, a <newline> shall be inserted before the new addition. The resulting script shall have the same properties as the script operand, described in the OPERANDS section.
当[2addr]
和{
之间有一个换行符时脚本无效:
$ sed -e '/something/' -e '{' -e '}' /dev/null
sed: -e expression #1, char 11: missing command
$ sed '
/something/
{
}' /dev/null
sed: -e expression #1, char 13: unknown command: `
'
将 {
与 [2addr]
放在一起修复了问题,因为它删除了换行符:
$ sed -e '/somethimg/{' -e '}' /dev/null
所以加上过滤表达式:
sed
-e '\^<!-- cssintern -->^{'
# ^^ ^^ here '{' is with /expression/
# or just: -e '/<!-- cssintern -->/{'
-e 'r blabla/styles1.css.frag'
-e d
-e '}' -i 'blabla/12.17 - Acatistul Sfantului Proroc Daniel.frag.html'
应该没问题。