【问题标题】:Using sed awk to replace characters in a string使用 sed awk 替换字符串中的字符
【发布时间】:2015-01-13 14:58:52
【问题描述】:

我在一个文件夹中有大约 300 个文件。 我需要在文件中搜索这个标签

<b>This string must stay</b><br />    

并将它们替换为

<CustomerInfo>This string must stay</CustomerInfo>    

内部字符串不能更改。

【问题讨论】:

  • 你的意思不是很清楚,你尝试过的也不是很清楚。查找特定目录中的所有文件并替换此特定字符串?
  • 我有这个标签%%%%%
    需要用%%替换它,不管内容是什么
  • 这不是提问的方式:提供一个完整的例子,你尝试了什么以及输出应该是什么样子。此外,可能会发生许多边缘情况:如果给定文本中有其他标签怎么办?如果文本跳到下一行怎么办?澄清这一点。
  • 100% 的文件有 my string
    我需要使用 作为开始标签,使用
    作为结束标签。 . 我将替换开始标签以及结束标签

标签: html regex awk sed


【解决方案1】:

试试这个:

sed 's@<b>.*</b><br />@<CustomerInfo>This string must stay</CustomerInfo>@g' file.txt

【讨论】:

  • 这实际上并没有完全解决 op 的问题
  • 嗨 Aduch 谢谢.. 只是忘了里面的字符串不是恒定的.. 即在某些情况下.. 'Hallo world' 可能会出现..
  • 需要对 $(find $1 -type f -iname '*.html'); 中的文件执行类似 #!/bin/bash 的操作替换标签完成
【解决方案2】:

这将替换当前目录和子目录中每个文件中的字符串(它不会忽略二进制文件,所以要小心你想要的)

这适用于命令依赖项中的查找(unix 具有)

首先要确保这不会破坏任何东西,试试这个(它只会显示它所做的预览):

find . -type f -exec sed -e 's@<b>\(.*\)</b><br />@<CustomerInfo>\1</CustomerInfo>@g' {} \;

如果它按预期工作,那么这里是龙:

find . -type f -exec sed -i 's@<b>\(.*\)</b><br />@<CustomerInfo>\1</CustomerInfo>@g' {} \;

【讨论】:

  • 谢谢会试一试
  • 嗨 Aduch .. \1 不起作用.. 未返回原始字符串.. 我在文件中得到的只是 1 .. 脚本将所有原始客户信息替换为 1 :-(
  • 是吗?真的很抱歉发生在你身上,你能描述一下你的环境(操作系统、版本和sed版本)吗?
【解决方案3】:

您可以使用以下内容:

sed -r 's#<b>([^<]*)</b><br />#<CustomerInfo>\1</CustomerInfo>#g' file

一旦您确定它有效,请将 -r 替换为 -ir 以进行就地编辑。

如果您想在您的文件中运行它,当您在某处发表评论时,请执行以下操作:

find $1 -type f -iname '*.html' -exec \ 
       sed -r 's#<b>([^<]*)</b><br />#<CustomerInfo>\1</CustomerInfo>#g' {} \;

说明

  • &lt;b&gt;([^&lt;]*)&lt;/b&gt;&lt;br /&gt; 查找具有 &lt;b&gt;....&lt;/b&gt;&lt;br /&gt; 的内容,并抓住其间的文字。
  • &lt;CustomerInfo&gt;\1&lt;/CustomerInfo&gt; 将其替换为 &lt;CustomerPage&gt; + 给定文本 + &lt;/CustomerPage&gt;

测试

给定一个示例文件:

$ cat a
hello
bye
aaa <b>hello</b><br /> beee
<b>hello</b><br />

<b>hello</b>blabla

让我们试试吧:

$ sed -r 's#<b>([^<]*)</b><br />#<CustomerInfo>\1</CustomerInfo>#g' a  hello
bye
aaa <CustomerInfo>hello</CustomerInfo> beee
<CustomerInfo>hello</CustomerInfo>

<b>hello</b>blabla

【讨论】:

  • 最后一个问题还有 1 个。我可以使用哪个命令来替换像这样的字符串 '(adsbygoogle = window.adsbygoogle || []).push({});'在所有文件中.. 我的意思是删除所有文件中的所有这些字符串表示
  • @KingsleySchmid 再次使用sedsed 's/(adsbygoogle = window.adsbygoogle || []).push({});'//g' file
  • 要非常小心。 sed 不能对字符串进行操作,只能对正则表达式进行操作,并且您要搜索的字符串中有几个正则表达式元字符,因此它们不会匹配您想要的某些字符串并错误地匹配您不想要的其他字符串。您可能想要切换到 awk,因为它支持搜索和替换字符串而不是正则表达式。
  • 这完全正确,@EdMorton。我猜sed 中的唯一方法是转义任何单个正则表达式字符。如果sed 有一个选项-F 就像grep 这样会非常方便...
  • @fedorqui 不,你不能这样做,因为通过转义正则表达式字符可能会引入问题(例如,如果你转义已经转义不同字符的转义怎么办),即使那样你无法处理 sed 正则表达式分隔符。您不能将 sed 用于字符串。时期。是的,类似 grep 的 -F 用于 sed 会非常有用。
猜你喜欢
  • 2017-02-08
  • 2019-08-07
  • 1970-01-01
  • 2020-02-18
  • 2015-10-25
  • 1970-01-01
  • 2015-12-18
  • 2012-10-15
  • 2012-10-09
相关资源
最近更新 更多