2017-10-29 52 views
1

冒号点我需要一个sed正则表达式线,这将改变冒号到围绕一个变量从该SED线改变周围在bash

a:b:c :d: e:f 

a:b:c: .d. e:f 

诸如点( d变量)。我在网上搜索了无数个小时,试图找到解决方案......当Google忽略大多数标点符号时,这不是一件容易的事。我还搜索了几十个shell脚本书和PDF,但无济于事。尽管我使用了单个字母,但本例中的每个字母都可以是完整的变量,例如

cat:dog:bird :rabbit: mouse:rat 

rabbit),甚至路径名:

/home/someone/bin:/home/someone/.local/bin:/usr/local/sbin :/usr/local/bin: /usr/games:/usr/local/games:/snap/bin 

/usr/local/bin)。所有的例子都有一个共同点,那就是中间的一个变量,它被冒号包围着,需要改变为句点。这甚至可能与sed?任何帮助是极大的赞赏。

+1

你是否也有大约要替换如下所示什么空间?或者你是否需要在第三和第四个冒号之间进行切换? – Sundeep

+1

想法:您可能无法在网络上找到现成的sed字符串来实现您所寻求的。您可能需要(如果您还没有)尝试构建常规搜索并自己替换表达式以实现您的特定目标。关于如何构建查找和替换字符串,有一些很好的pdf,网页和utube vids。如果你确实找到了能够完成这项工作的人,那么你可以为他人发布你的解决方案来解决这个特定的模式识别问题。 –

+0

为什么':b:'和':dog:'没有被替换? –

回答

0

你所说的变量不完全清楚。如果它是一个字(字母数字和下划线仅字符),你可以使用:

sed -E 's/(^|\s):(\w+):($|\s)/\1.\2.\3/' 

但是,如果它是一个路径,事情要复杂得多,因为路径几乎可以包含任意字符,包括空格...如果你想要一个适用于路径的正则表达式,你必须告诉我们更多关于你拥有的路径。

1

如果它总是需要更换,你可以用awk像第二个字符串:

$ awk '{gsub(/^:|:$/,".",$2)}1' file 
a:b:c .d. e:f 

(如果你想切换领先,并在所有的字符串尾随冒号,用途:

$ awk '{for(i=1;i<=NF;i++)gsub(/^:|:$/,".",$i)}1' file 
0

如果它的中间有3个部分。 您可以使用

sed 's/ :\([^:]*\):/.\1. /' 

或者如果您有标签

sed 's/\t:\([^:]*\):\t/\t.\1.\t/' 

但变量不能有:在它