regex - Sed 用文件内容替换模式

标签 regex bash sed

我想使用 sed(我想?)用文件内容替换模式。

例子

文件 1(主文件)

Hello <<CODE>>
Goodbye.

文件2(内容)

Anonymous person,
I am very nice. 

文件 3(目标)

Hello Anonymous person,
I am very nice.
Goodbye.

现在,我正在使用这个命令:

sed "/<<CODE>>/{r file2
:a;n;ba}" file1            | \
    sed "s/<<CODE>>//g"    > \
    file3

但是这个输出:

Hello
Anonymous person,
I am very nice.
Goodbye.

(注意 Hello 之后的换行符)

  • 如果不获取换行符,我如何做到这一点?
    • (请注意 file2 可能包含各种内容:括号、换行符、引号……)

最佳答案

使用 awk 更简单:

awk 'FNR==NR{s=(!s)?$0:s RS $0;next} /<<CODE>>/{sub(/<<CODE>>/, s)} 1' file2 file1
Hello Anonymous person,
I am very nice.
Goodbye.

解释:

  • FNR==NR - 为输入中的第一个文件执行此 block ,即 file2
  • s=(!s)?$0:s RS $0 - 在字符串中连接整个文件内容 s
  • next - 阅读下一行直到 EOF在第一个文件上
  • /<<CODE>>/ - 如果一行带有 <<CODE>>被发现执行那个 block
  • sub(/<<CODE>>/, s) - 替换 <<CODE>>带字符串 s (file2 的数据)
  • 1 - 打印输出

编辑: 非正则表达式方式:

awk 'FNR==NR{s=(!s)?$0:s RS $0; next}
     i=index($0, "<<CODE>>"){$0=substr($0, 1, i-1) s substr($0, i+8)} 1' file2 file1

关于regex - Sed 用文件内容替换模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27361981/

相关文章:

linux - 如何使用 bash 脚本替换单引号中的值?

Javascript 正则表达式仅匹配括号内

regex - 使用正则表达式验证标题案例全名

linux - 字符串在每个变量后重新开始 [Bash]

linux - bash 中的 PHP preg_replace,具体情况

bash - 3 制表符分隔文件中的文件字符串匹配模式 awk

linux - 使用 shell 脚本在配置文件中追加行

python - 为什么正则表达式在 python 中返回错误?

c# - 修改 XAML 文件

bash - 获取数组中基于子字符串的唯一文件名列表