Bash sed-“经济对话”;未知命令“;用文件内容替换模式时

Bash sed-“经济对话”;未知命令“;用文件内容替换模式时,bash,sed,runtime-error,Bash,Sed,Runtime Error,我尝试操作一些“模板化”文本文件。这意味着这些文件包含一些“标记”,需要用一些实际的字符串替换这些标记-硬编码或从其他文件读取 我有以下两行: sed -r -e 's_<!-- cssintern -->_<style type="text/css">\n<!-- cssintern -->\n</style>\n_' -i "$out_dir_aca/books_1by1/independent/$(bas

我尝试操作一些“模板化”文本文件。这意味着这些文件包含一些“标记”,需要用一些实际的字符串替换这些标记-硬编码或从其他文件读取

我有以下两行:

    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"
在Windows
cmd
脚本中,运行良好。(
%%H
在使用
for
解析文件夹中的所有文件时,引用文件名)。实际上,我正在用Linux重写旧的脚本,如exercize—希望增加简单性和额外的特性

我打算调整以下
sed
命令:

sed -e '/<TEXT1>/{r File1' -e 'd}' -i File2
sed-e'/{r File1'-e'd}'-i File2
满足我的特殊需要

注意:我提供了确切的文件名和路径,认为它们可能提供了一种见解

注意:我在虚拟机中使用Debian 10.7

注意:脚本文件以
开头/bin/bash-xv
<代码>-xv显然仅在调试时使用,否则将丢失。

(注释):

其中
[2addr]
是例如
/filtering/
表达式。选项
-e
的作用是(强调我的):

如果指定了-e或-f选项,则编辑命令的脚本最初应为空。每个-e或-f选项指定的命令应按指定顺序添加到脚本中。每次添加时,如果之前的添加(如果有)来自a-e选项,则应在新添加之前插入a。生成的脚本应具有与脚本操作数相同的属性,如操作数部分所述

[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
-e'\^^{'
#^^^^此处{与/expression一起使用/
#或者只是:-e'/{'
-e'r blabla/styles1.css.frag'
-e-d
-e'}'-i'blabla/12.17-Acatistul Sfantului Proroc Daniel.frag.html'

应该没问题。

你希望表达式
-e'^^'
做什么?我在那里没有看到sed命令。@larsks:我不确定我是否理解你的问题。我尝试实现这里提供的解决方案:。我最终使用了
^
而不是
//code>,但它们都不起作用。
只是一个字符串,而不是“pattern”。我尝试只使用
cssintern
,没有任何特殊字符,也没有任何积极的结果。
-e'\^^'
将是一个有效的sed命令。您需要告诉sed您使用了不同的分隔符。@KamilCuk:I”结束“当我放弃寻找一个有效的定界符时,我从
/
开始,但失败了,这就是为什么我继续寻找其他定界符的原因。不做其他修改就返回将是徒劳的(由于您的评论,我已经尝试过了)。“不可能用正则表达式解析xml。”-这太愚蠢了,当然有可能。我同意,可能出于各种原因不推荐我,但不可能?!考虑到我只想用另一个字符串替换一个非常特定的字符串,我认为没有理由不使用sed/regexes。@oguzismail:我试过了,但仍然没有成功。
+sed-e'\^^'-e'{r/home/vici/Dropbox/MyFiles/work/uuuuuuuu rug/uuuu!u workarea/1_txt_in/##########/styles1.css.frag'-ed-e'}“-i'/home/vici/Dropbox/MyFiles/work/uuuuuu rug/uuu!\uu workarea/2\u txt\u out/aca/books\u 1by1/independent/12.17-Acatistul Sfantului Proroc Daniel.frag.html”sed:-e expression#1,char 21:缺少命令
。命令行:
sed-e'\^'-e'-r'$src\u dir-frags\u-struct/styles1.css.frag'-e'-d'-e'-d'-acau'-dir/acau/$(basename“$aca_frag”).html“
。当然,仍然没有理由在第一个正则表达式中使用
^
而不是
/
。此外,可能会将两个脚本合并为一个。这很有效,谢谢。
$ 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: `
'
$ 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'