我想解析一个文件,并将“ ::”和“ :::”之间的文本替换为已经存在的文本,现在只是大写。
我尝试使用此命令:
sed 's/\(::\)\(.*\)\(:::\)/\1\U\2\E\3/' filename
但是输出只是在我要大写的字符串的开头放置了一个U,在其末尾放置了E。
答案 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
本机转换命令,模式匹配和保留空间中的副本。