sed复杂字符串(单引号和双引号&/空格...)

时间:2019-02-02 19:10:18

标签: string sed replace quotes

你好,我已经做了很多研究,但从未找到适合我需要的解决方案。

我必须替换原始的xml行:

# EXTRACT NEEDED SUB LISTS
info_list <- lapply(lst2, `[[`, "information")
filings_list <- lapply(lst2, `[[`, "filings")

proc_merge <- function(i, f, n) {
  if(nrow(f) == 0) {
    # FILL EMPTY COLUMNS WITH NA
    i[colnames(filings_list[[1]])] <- NA
    df <- cbind(ID=n, i)
  } else {
    df <- cbind(ID=n, i, f)
  }
  return(df)
}

# BUILD DF LIST
df_list <- Map(proc_merge, info_list, filings_list, names(info_list))

# ROW BIND ALL ELEMENTS AND RESET ROWNAMES
final_df <- do.call(rbind, df_list)
row.names(final_df) <- NULL

包含经过修改的xml行:

<access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %T " prefix="access_${jboss.server.name}" suffix=".log"/>

我尝试制作2个变量。这是我的脚本:

<access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %T %{i,Proxy-Remote-User}" prefix="access_${jboss.server.name}" suffix=".log"/>

但是我得到了一些重复的东西:

#!/bin/bash
MOD=`more /aplicaciones/users/t682213/alvaro/mod`
XML=`more /aplicaciones/users/t682213/alvaro/xml`
sed "s#$XML#$MOD#g" test2

请帮助我,我想用另一个非常复杂的字符串替换一个非常复杂的字符串。

2 个答案:

答案 0 :(得分:1)

丹D.是正确的。使用正则表达式操纵XML是一种邪恶的方法,在某些情况下可以奏效,但很快就会成为维护的噩梦。不过,如果你真的相信,因为某些原因(如没有XML解析器availabel)你刚才的的到用sed该任务,我可以回答你的问题(引用另一个SO问题)。

您需要转义文件中的字符串。在这种情况下,麻烦来自替换字符串中的字符&,这意味着将整个匹配项放在此处。见Escape a string for a sed replace pattern关于如何逃脱的搜索和替换模式的建议。

答案 1 :(得分:0)

我找到了解决方案

正如Michael提到的,问题出在&,所以我在两个文本变量(MOD和XML)中转义了&

这是我的结果,(如果您发现sed中的正则表达式有问题,例如/,“”,&,尝试此操作

首先,我为要替换(xml)的xml字符串创建两个文本,另一个为要替换为(mod)的xml字符串创建文本。

这是两个文本:

xml (带有&逸出: \&

<access-log pattern="%h %l %u %t \&quot;%r\&quot; %s %b \&quot;%{i,Referer}\&quot; \&quot;%{i,User-Agent}\&quot; %T " prefix="access_${jboss.server.name}" suffix=".log"/>

mod(带有&逸出: \&

<access-log pattern="%h %l %u %t \&quot;%r\&quot; %s %b \&quot;%{i,Referer}\&quot; \&quot;%{i,User-Agent}\&quot; %T %{i,Proxy-Remote-User}" prefix="access_${jboss.server.name}" suffix=".log"/>

我创建了一个测试txt来模拟我想在其中工作的完整xml,称为 test2

<access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %T " prefix="access_${jboss.server.name}" suffix=".log"/>
HOLA
ADIOS

最后创建一个用sed进行更改的shell脚本:(非常重要,要使用#代替/,用“”代替'')

#!/bin/bash
MOD=`more /aplicaciones/users/t682213/alvaro/mod`
XML=`more /aplicaciones/users/t682213/alvaro/xml`
sed "s#$XML#$MOD#" test2 >> test3 

最后,脚本会生成正确修改的test3文本:

<access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %T %{i,Proxy-Remote-User}" prefix="access_${jboss.server.name}" suffix=".log"/>
HOLA
ADIOS