SED替换两个已知单词之间的空格和大写字母

时间:2010-11-04 23:19:19

标签: unix sed

我试图在myURL =“different_text_capitalized”的文本文件中替换所有出现的myURL =“不同文本大写”,并且两者之间的文本在每种情况下都不同。缠绕我的头很困难。这是我到目前为止所做的:

sed -i "s/myURL\".*\"/myUrl\"$VAROFSOMEKIND/g" file.text 

2 个答案:

答案 0 :(得分:0)

至少使用GNU sed(“-i”选项隐含使用),您可以使用“\L”进行大小写转换。

sed -i 's/myURL="\([^"]*\)"/myURL="\L\1"/g' file.text

如果在同一行上有其他材料并且其中包含空格,则只需在URL文本上替换下划线的空格(或者我的大脑已经冻结)相当困难。

我可能会使用Perl:

#!/bin/perl -p
if (m/(.*myURL=")([^"]*)(".*)/)
{
    my($bow, $mid, $aft) = ($1, lc($2), $3);
    $mid =~ s/ /_/g;
    $_ = "$bow$mid$aft\n";
}

这有点接近臭名昭着的Perl'线噪声',但是......

  • '-p'表示Perl读取一行,在其上执行脚本,然后打印结果;该行将被读入$_
  • 正则表达式将行分为三部分; 'myURL ='之后的材料直到双引号;双引号内的材料;关闭双引号后的材料(不包括换行符)。
  • 三重分配为三个匹配的部分提供名称,但在过程中将中间部分转换为小写。
  • 替代品用中间部分的下划线替换空白。
  • 该作业再次将它们粘合在一起,恢复掉落的换行符。
  • Perl会自动打印出$_

答案 1 :(得分:0)

这个怪物只适用于每一行的第一个URL(Jonathan Leffler的sed命令也是如此 - 但g修饰符会修复他的)。它会将一对引号之间的文本更改为小写,并将下划线替换为:

中的空格
sed 's/myURL="\([^"]*\)"/myURL="\L\n\1\n"/;h;s/[^\n]*\n\([^\n]*\)\n.*/\1/;s/ /_/g;x;G;s/\([^\n]*\)\n[^\n]*\n\([^\n]*\)\n\(.*\)/\1\3\2/' inputfile