我需要一个sed正则表达式行,它会将冒号更改为围绕变量的点,例如来自此
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吗?非常感谢任何帮助。
答案 0 :(得分:1)
如果它总是第二个需要替换的字符串,你可以使用awk:
$ awk '{gsub(/^:|:$/,".",$2)}1' file
a:b:c .d. e:f
(如果要在所有字符串中切换前导冒号和尾随冒号,请使用:
$ awk '{for(i=1;i<=NF;i++)gsub(/^:|:$/,".",$i)}1' file
答案 1 :(得分:0)
你所谓的变量并不完全清楚。如果是单词(仅限字母数字和下划线字符),则可以使用:
sed -E 's/(^|\s):(\w+):($|\s)/\1.\2.\3/'
但是如果它是一个路径,那么事情要复杂得多,因为一个路径几乎可以包含任何字符,包括空格...如果你想要一个适用于路径的正则表达式,你必须告诉我们更多关于它的类型你有的道路。
答案 2 :(得分:0)
如果它在中间有3个部分。 你可以用
sed 's/ :\([^:]*\): / .\1. /'
或者如果你有标签
sed 's/\t:\([^:]*\):\t/\t.\1.\t/'
但变量不能:在其中