Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix SED替换两个已知单词之间的空格和大写_Unix_Sed - Fatal编程技术网

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

Unix SED替换两个已知单词之间的空格和大写,unix,sed,Unix,Sed,我试图将文本文件中所有出现的myURL=“different text Capitalized”替换为myURL=“different\u text\u Capitalized”,并且两者之间的文本在每种情况下都是不同的。我的头绕不住它。以下是我目前掌握的情况: sed -i "s/myURL\".*\"/myUrl\"$VAROFSOMEKIND/g" file.text 使用GNU sed(其使用由“-i”选项暗示),您至少可以使用“\L”进行大小写转换 sed -i 's/myURL=

我试图将文本文件中所有出现的myURL=“different text Capitalized”替换为myURL=“different\u text\u Capitalized”,并且两者之间的文本在每种情况下都是不同的。我的头绕不住它。以下是我目前掌握的情况:

sed -i "s/myURL\".*\"/myUrl\"$VAROFSOMEKIND/g" file.text 
使用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读取一行,在其上执行脚本,并打印结果;该行被读入
    $\u
  • 正则表达式将行拆分为三段;“myURL=”后双引号内的材料;双引号内的材料;以及收盘后的材料双引号(不包括换行符)
  • 三元组赋值为三个匹配的部分命名,但在此过程中将中间部分转换为小写
  • 替换项在中间部分用下划线替换空格
  • 作业将所有内容重新粘在一起,恢复掉的新行
  • Perl会自动打印出
    $\uuuz

这个怪物只会在每行的第一个URL上工作(乔纳森·莱夫勒的
sed
命令也是如此-但是
g
修饰符会修复他的URL)。它会将一对引号之间的文本更改为小写,并用下划线替换以下空格:

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

@丹尼斯;谢谢,我认为应该适当修改Perl脚本(一个是循环,另一个是正则表达式上的一些修饰)。