使用sed命令将缩写字符串(U.S.A。)替换为USA

问题描述 投票:2回答:4

如何使用sed命令替换像“U.S.A”这样的字符串。到“美国”或“D.A.R.P.A.”致DARPA。 “不是字符串的一部分。

所以我的目标是只从大文本中替换缩写。

我尝试了 sed "s/.//g" file.txt >file2.txt,但这取代了所有出现的点。

然后我尝试了一堆不同的组合,如:

sed "s/([A-Z]\.)+/[A-Z]/g" file.txt >file2.txt显然不起作用。

显然终端不接受()括号或嵌套括号

如果我想用非常具体的东西替换一个字母后跟一个点,我可以使用sed "s/[A-Z]/a/g" file.txt >file2.txt

awk sed
4个回答
1
投票

假设OP想要删除大写字母后出现的点

$ s='U.S.A. foo.bar D.A.R.P.A. a.b.'
$ echo "$s" | sed 's/\([A-Z]\)\./\1/g'
USA foo.bar DARPA a.b.

$ # if ERE is available as -E or -r option
$ echo "$s" | sed -E 's/([A-Z])\./\1/g'
USA foo.bar DARPA a.b.
  • \([A-Z]\)capture group\1是对匹配的字符串的反向引用
  • \.作为.是一个元字符,它需要被转义以匹配它
  • 另请参阅wooledge quotes以了解何时使用单引号/双引号

1
投票

以下sed可能会帮助你,它是简单的sed基于其逻辑sed s/old_value/new_value/g

echo "U.S.A." | sed 's/\.//g'

解决方案第二:由于OP已经改变了他的问题所以现在也添加了这个答案。假设我们有以下Input_file。

cat Input_file
U.S.A. D.A.R.P.A.
fewqfewfew fwefjwefu1e13rvnoi.wbvwvnwv
D.A.R.P.A. wnvwnvnewv nwvnrwnvrwnvrw


awk --re-interval '
{
  val=$0;
  while(match(val,/([a-zA-Z]{1,}\.{1,}){1,}/)){
    value=value1=substr(val,RSTART,RLENGTH);
    gsub(/\./,"",value1);
    sub(value,value1,$0);
    val=substr(val,RSTART+RLENGTH)}
}
1
'  Input_file

输出如下。

USA DARPA
fewqfewfew fwefjwefu1e13rvnoiwbvwvnwv
DARPA wnvwnvnewv nwvnrwnvrwnvrw

注意:我的awk是旧版本,以防你有最新版本的awk然后你不需要在上面的代码中使用--re-interval


1
投票

你可以尝试这个sed

sed -E ':A;s/([A-Z]\.)([A-Z]\.{1,})/.\1.\2/;tA;s/(\.{1,})([A-Z])(\.)/\2/g' infile

1
投票

这可能适合你(GNU sed):

sed 's/\b\([[:upper:]]\)\b\./\1/g' file

这将删除.之前的单字符大写单词。

© www.soinside.com 2019 - 2024. All rights reserved.