sed命令可在两个特定字符串之间使用大写文本

时间:2019-06-13 22:29:20

标签: bash macos sed

我想解析一个文件,并将“ ::”和“ :::”之间的文本替换为已经存在的文本,现在只是大写。

我尝试使用此命令:

sed 's/\(::\)\(.*\)\(:::\)/\1\U\2\E\3/' filename

但是输出只是在我要大写的字符串的开头放置了一个U,在其末尾放置了E。

5 个答案:

答案 0 :(得分:2)

为我工作,这使我认为您可能不在Linux上?

echo "This is :: some sample text ::: to test uppercasing" | sed 's/\(::\)\(.*\)\(:::\)/\1\U\2\E\3/' 
This is :: SOME SAMPLE TEXT ::: to test uppercasing

答案 1 :(得分:1)

如果选择Perl,则可以这样说:

echo "This is :: some sample text ::: to test uppercasing" | perl -pe 's/(::)(.*)(:::)/\1\U\2\E\3/'
This is :: SOME SAMPLE TEXT ::: to test uppercasing

答案 2 :(得分:0)

gawk '{match($0,/::.*:::/,a) ;gsub(/::.*::/,toupper(a[0]))}1' input

在这里,使用gawk的无位加密解决方案:match用于查找所需的字符串,后来gsub使用该字符串将其转换为使用{{ 1}}函数。

答案 3 :(得分:0)

您非常接近。

在Mac OS X上,您将需要安装GNU sed,因为您正在使用的功能-\U-是GNU扩展。

因此,请先安装它:

▶ brew install gnu-sed

然后,我通常在某些地方粘贴这样的代码:

shopt -s expand_aliases
alias sed='/usr/local/bin/gsed'

然后您的GNU sed将起作用。

最后,我将代码简化为:

▶ sed -E 's/(::)(.*)(::)/\1\U\2\E\3/' <<< "foo::bar::baz" 
foo::BAR::baz

请注意,-E为您提供了扩展正则表达式,并且在执行捕获时提供了更简洁的语法。

答案 4 :(得分:0)

这可能对您有用(GNU sed):

sed 's/::[^:]*:::/\U&/' file

或者也许:

sed 's/::[^:]*:::/\n&\n/;h;y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/;G;s/.*\n\(.*\)\n.*\n\(.*\)\n.*\n/\2\1/' file

使用sed y本机转换命令,模式匹配和保留空间中的副本。