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

时间:2018-03-04 16:46:40

标签: awk sed

如何使用sed命令替换类似" U.S.A。"的字符串。到" USA"或者" 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

4 个答案:

答案 0 :(得分: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,那么你不需要使用{{1}然后在上面的代码中。

答案 1 :(得分:1)

你可以试试这个sed

ui_print("-- Installing: Magisk-v16.0");
package_extract_dir("META-INF/ADD-ONS/Magisk-v16.0", "/tmp/Magisk-v16.0");
run_program("/sbin/busybox", "unzip", "/tmp/Magisk-v16.0/Magisk-v16.0.zip", "META-INF/com/google/android/*", "-d", "/tmp/Magisk-v16.0");
run_program("/sbin/busybox", "sh", "/tmp/Magisk-v16.0/META-INF/com/google/android/update-binary", "dummy", "1", "/tmp/Magisk-v16.0/Magisk-v16.0.zip");
delete_recursive("/tmp/Magisk-v16.0");

答案 2 :(得分: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以了解何时使用单/双引号

答案 3 :(得分:1)

这可能适合你(GNU sed):

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

这将删除前面带有单个字符大写单词的.