regex sed在两个或多个大写字母之间添加点,大写字母后面不跟小写字母

axkjgtzd  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(131)

我需要你帮忙对付sed
两个命令
1.在两个或多个大写字母之间加点
1.大写字母后面不跟小写字母。
我试着在两个或两个以上的大写字母之间加上点。
我想转换

A
[BC]
XYZ

字符串

A
[B.C.]
X.Y.Z.


我最接近的是

echo "abcd Abcd ABcd ABCd ABCD" |
sed -e "s/[A-Z]\{2\}/&./g"


产生

abcd Abcd AB.cd AB.Cd AB.CD.</sub>


如果更简单的话,另一个单独的命令可以在任何大写字母之间添加一个点,后面不跟小写字母。

Ab
[A]
D6
FGH
X"


Ab
[A.]
D.6.
F.G.H.
X."


最接近的是:

echo "abcd Abcd ABcd ABCd ABCD" |
sed -e "s/[A-Z][^a-z]/&./g"


产生

abcd Abcd AB.cd AB.Cd AB.CD.

vybvopom

vybvopom1#

传统上,一旦找到与正则表达式匹配的文本,该文本将被消耗,不再考虑进一步的匹配。重叠匹配是不可能的。为了解决这个问题,一些正则表达式引擎支持查找Assert(look-ahead/look-behind),它匹配但不消耗文本。
标准的sed正则表达式没有复杂的查找功能,因此不足以在一次遍历中完成此操作。它需要某种循环,以允许已经使用的文本重新用于更多的匹配尝试。
两个或多个大写字母(彼此相邻)之间有圆点:

$ echo 'A [BC] XYZ' | sed '
    :a
    s/\([A-Z]\)\([A-Z]\)/\1.\2/g
    ta
'
A [B.C] X.Y.Z
$

字符串
在任何后面没有小写字母的大写字母之间添加一个点:

$ echo 'Ab [A] D6 FGH W.X"Z' | sed '
    :a
    s/\([A-Z]\)\([^\na-z]\|$\)/\1\n\2/g
    ta
    y/\n/./
'
Ab [A.] D.6 F.G.H. W..X."Z.
$


第二个命令假定大写字母后面的点或换行符算作“非小写字母”,因此执行中间替换以确保循环终止。
其他一些正则表达式引擎更强大。
例如,使用Perl的积极和消极前瞻Assert:

$ echo 'A [BC] XYZ' | perl -pe 's/([A-Z])(?=[A-Z])/$1./g'
A [B.C] X.Y.Z
$
$ echo 'Ab [A] D6 FGH W.X"Z' | perl -pe 's/([A-Z])(?![a-z])/$1./g'
Ab [A.] D.6 F.G.H. W..X."Z.
$

的字符串

bwntbbo3

bwntbbo32#

任何一个大写字母后面跟了另一个大写字母,都不会自动跟一个小写字母,所以根据第二条规则,它应该得到一个点,第一条规则没有添加任何东西。
这 * 几乎 * 工作:

sed 's/\([A-Z]\)\([^a-z]\)/\1.\2/g'

字符串
但是它不会将第二个字符视为重叠匹配中的第一个字符的可能候选者,即使它是大写字母。因此Perl lookaheadAssert更好:

perl -pe 's/([A-Z])(?![a-z])/$1./g'

相关问题