【问题标题】:Is there anyway of converting uppercase to lowercase as well as modifying spaces to text in a file using SED是否有将大写转换为小写以及使用 SED 将文件中的空格修改为文本的方法
【发布时间】:2014-07-23 00:35:09
【问题描述】:

我有一些需要修复 URL 文本的 html 文本。我需要:

1) 将 URL 中的文本转换为小写 还 2) 将 URL 中的任何空格转换为连字符 还 3) 从 URL 中删除任何括号

我在每个文件中多次出现这种模式:

<div class="classname"><a href="/URL"><img src="${asset.image/url}" alt="TEXT" class="another-class-name" ></a></div>

示例:
我想改变这个模式:<div class="classname"><a href="/URL-EXAMPLE-ONE"><img src="${asset.image/url}" alt="TEXT" class="another-class-name" ></a></div>

收件人:<div class="classname"><a href="/url-example-one)"><img src="${asset.image/url}" alt="TEXT" class="another-class-name" ></a></div>

我有许多文件,并且想要进行 infile 替换。 /URL-EXAMPLE-ONE 可以是空格、括号的任意组合。

我现在有了,使用以下建议:

/sw/bin/sed -e '/<div class="mk-man-logo-mod5-m"><a href="\/[A-Z -{}&]*"></ {
   h;
   s/.*<div class="mk-man-logo-mod5-m"><a href="\/\(.*\)"><img.*/\1/;
   s/\(.*\)/\L\1/;
   s/[ &]/-/g;
   s/[()]//g;
   s/<img.*//;
   x;
   s/\(.*<div class="mk-man-logo-mod5-m"><a href="\/\)\(.*\)\(<img.*\)/\1\3/;
   G;
   s/\n//;
   }' $e

但我得到的输出是,例如:

原文: &lt;div class="classname"&gt;&lt;a href="/ABC (D&amp;E)"&gt;&lt;img src="${asset.images/common/manufacturer_logos/medium/abb-m.gif}" alt="TEXT" class="another-classname" &gt;&lt;/a&gt;&lt;/div&gt;

转换后的文字: &lt;div class="classname"&gt;&lt;a href="/&lt;img src="${asset.images/url}" alt="TEXT" class="another-classname" abc-d-ediv&gt;

其实想要: &lt;div class="classname"&gt;&lt;a href="/abc-d-e"&gt;&lt;img src="${asset.images/url}" alt="TEXT" class="another-classname"&gt;&lt;/a&gt;&lt;/div&gt;

谁能提供进一步的帮助?

提前非常感谢, 亚历克斯

【问题讨论】:

  • 将以下内容添加到您的 sed 命令中:-e 's/ /-/g' -e 's/[()]//g'。第一个将空格更改为连字符;第二个删除括号。
  • @savanto:这将使输出中的 div-class="classname" 而不是 div class="classname"。
  • 有y/// 命令:y/ABCDEFGHIJKLMNOPRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ 但它可能对您的目的过于热情。您可能必须使用保持空间和模式空间来玩有趣的游戏才能使其发挥作用。您可以检查/实验您的sed 是否将\L 或\U(和\E)识别为s/// 的替换部分中的转义符,以表示小写、大写(和“结束”)映射,但可能不会。
  • @anubhava 好点。您可以使用-e 's/ /-/3g' 仅替换第三个空格。
  • @savanto 您能否提供进一步帮助,请参阅我上面编辑过的问题。

标签: bash text replace sed substitution


【解决方案1】:

执行所有替换的sed 脚本:

sed '/<div class="classname"><a href="\/.*">/ { h; s/<div class="classname"><a href="\///; s/\(.*\)/\L\1/; s/ /-/g; s/[()]//g; x; s/\(<div class="classname"><a href="\/\)\(.*\)/\1/; G; s/\n//}'

解释:

  • /&lt;div class="classname"&gt;&lt;a href="\/.*"&gt;/ 仅在模式匹配时执行命令。
  • h 将行的副本存储在保留空间中。
  • s/&lt;div class="classname"&gt;&lt;a href="\/// 删除除 url 之外的所有内容。
  • s/\(.*\)/\L\1/ 将网址转换为小写。
  • s/ /-/g 将空格转换为连字符。
  • s[()]//g 去掉括号。
  • x 将保持空间与模式空间交换(现在再次在原始行上运行)
  • s/\(&lt;div class="classname"&gt;&lt;a href="\/\)\(.*)/\1/ 删除网址。
  • G 将保持空间附加到模式空间
  • s/\n// 删除 G 命令引入的换行符。

或者

如果您的数据始终与示例中给出的完全相同(即&lt;div class="classname"&gt;&lt;a href="/URL"&gt;)并且您不需要通用解决方案,则可以使用以下更简单的脚本:

sed '/<div class="classname"><a href="\/.*">/ { s/\(.*\)/\L\1/; s/ /-/3g; s/[()]//g }'

这将匹配模式,将所有内容转换为小写,删除所有括号,并用连字符替换从第三个空格到行尾的空格。

更新

针对更新后的问题,这里有一个新的sed 命令,它考虑了末尾的附加&lt;img&gt; 标签。

sed '/<div class="classname"><a href="\/[A-Z -(){}&]*"><img.*<\/div>/ { # match pattern
  h; # hold copy of original string
  # replace original string with just url, converted to lowercase.
  s/\(<div class="classname"><a href="\/\)\([A-Z -(){}&]*\)\("><img.*<\/div>\)/\L\2/;
  s/[ &]/-/g; # convert spaces, ampersands to hypens.
  s/[(){}]//g; # remove parentheses, braces.
  G; # append original string after url. Looks like: "converted-url\n<div class="classname"..."
  s/\n//; # remove newline introduced by append G.
  # swap out URL in original string with converted url.
  s/\([a-z-]*\)\(<div class="classname"><a href="\/\)\([A-Z -(){}&]*\)\("><img.*<\/div>\)/\2\1\4/;
}'

【讨论】:

  • 非常感谢您的回复,这确实填补了我知识中缺失的空白。我会跟进你的回答。问候亚历克斯
【解决方案2】:

爱它或恨它,有时 Perl 是最简单的。

perl -pe 's/<div class="classname"><a href="([^"]*)"/$1 =~ tr:A-Z ():a-z-:rd/e'

正则表达式过于笼统可以调整;我没有这样做是因为 OP 中的正则表达式似乎排除了带括号的 href,但请求要求删除括号。

【讨论】:

    猜你喜欢
    • 2014-07-24
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2018-08-17
    • 2013-12-02
    • 2012-11-27
    相关资源
    最近更新 更多