Sed 将单个文本替换为文件内容

Sed replace single text with content of file

提问人:Vancho 提问时间:11/13/2023 最后编辑:tripleeeVancho 更新时间:11/14/2023 访问量:58

问:

我有一个关于使用 .sed

我有一个JSON文件,我想把它插入到另一个文件中。

我正在尝试获取包含 4500 行的文件的所有内容,并替换我的 HTML 中的特定文本:.json

{DATA_INPUT}

我一直在使用

DATA_JSON=$(echo "$(<data.json)")

sed -i "s/{DATA_INPUT}]{\}/${DATA_JSON}{\}/g" convert.html

但似乎不起作用,

我得到了

/bin/find: Argument list too long

我也试过:

DATA_JSON=$(echo "$(<data.json)")
find . -maxdepth 1 -type f -name 'convert.html' \
    -exec sed -n "s/{DATA_INPUT}/${DATA_JSON}/g" {} \;

但是得到:

 /bin/sed: Argument list too long

我正在尝试将其与 Bash 集成。

所以基本上我正在尝试从文件中获取所有内容并替换我的文本convert.html

bash shell sed 查找

评论

0赞 Shawn 11/13/2023
顺便说一句。没有理由参与其中。DATA_JSON="$(<data.json)"echo
0赞 Shawn 11/13/2023
您的 JSON 是否包含任何对 HTML 有意义的字符?他们需要逃跑吗?
0赞 tripleee 11/13/2023
错误消息肯定来自您的第二次尝试吗?但无论如何,这种尝试在这里只是过于复杂。findfind
0赞 user1934428 11/13/2023
不要在一个问题中问两件事。您只在第二个示例中使用,因此第一个 ne 无法生成 /bin/find: 参数列表太长。最后,不工作是一个糟糕的问题描述。find

答:

2赞 tripleee 11/13/2023 #1

sed已经知道如何插入文件的内容。

sed -i '/{DATA_INPUT}/r data.json' convert.html

单独而言,这将在匹配后插入以下行的内容。如果你也想操纵比赛,也许可以尝试类似的东西data.json

sed '/{DATA_INPUT}/!b;s///;r data.json' convert.html

(可能会省略 直到您满意您有一个工作脚本)但这仍然相当笨拙,如果您想保留令牌周围的上下文并将其保留在插入内容的任一侧,则无法正常工作。-i{DATA_INPUT}

也许尝试例如 Awk 或 Perl 会更有成效,它们的只读性较低;

awk 'NR==FNR { gsub(/&/, "\\\\&"); lines = lines (lines ? "\n" : "") $0; next }
    /\{DATA_INPUT\}\{\}/ { sub(/\{DATA_INPUT\}/, lines) }
   1' data.json convert.html >new.html

评论

0赞 potong 11/13/2023
也许在 GNU sed 中?sed 's/{DATA_INPUT}//;T;r data.json' convert.html
0赞 tripleee 11/13/2023
@potong 我通常尽量避免使用不可移植的结构(尽管即使在 MacOS / BSD 上也不能开箱即用;你不得不说sedb-e '/{DATA_INPUT}/!b' -e 's///;r data.json')
0赞 Vancho 11/13/2023
@tripleee效果很好,除了:运行我得到的地方:s'command''我只想删除DATA_INPUT部分并替换data.json中的内容sed -i "s/{DATA_INPUT}/r data.json" convert.htmlsed: -e expression #1, char 26: unterminated
0赞 Vancho 11/13/2023
' sed -i '/{DATA_INPUT}/!b;s///;r data.json' convert.html ' 完美工作!
0赞 potong 11/13/2023
也许?在关闭之前可能需要另一个。sed -e '/{DATA_INPUT}/{s///;r data.json' -e '}' convert.html;}