如何使用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
假设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
是对匹配的字符串的反向引用\.
作为.
是一个元字符,它需要被转义以匹配它以下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
。
你可以尝试这个sed
sed -E ':A;s/([A-Z]\.)([A-Z]\.{1,})/.\1.\2/;tA;s/(\.{1,})([A-Z])(\.)/\2/g' infile
这可能适合你(GNU sed):
sed 's/\b\([[:upper:]]\)\b\./\1/g' file
这将删除.
之前的单字符大写单词。