Bash: 提取一行的部分内容并重写?

Bash: Extracting parts of a line and rewriting them?

我有一行(这是更多相同行的列表的一部分)看起来像:

au123456.us.something.net/789/net/Wonderful

...等等。

我想提取 auXXXXXX 部分中的 6 位数字,然后也提取 / 之后的所有内容,这样我就可以将这行重写为:

cdn123456.au.somewhereelse.com/789/net/Wonderful

这可能吗?我对替换要求和正则表达式不知所措......:facepalm:

我正在使用:

echo "au123456.us.something.net/789/net/Wonderful" | sed 's/au/cdn/g;s/us.something.net/au.somewhereelse.com/g'

但是对于像这样的实例来说它不够健壮:例如:au123456.us.something.net/789/net/CaultonHex。输出变为:

cdn123456.au.somewhereelse.com/789/net/CcdnltonHex

如果您不想全局匹配,请不要使用 g 标志。 g 标志使它替换所有出现的地方,没有 g 标志只替换第一次出现的地方。

$ printf "%s\n" au123456.us.something.net/789/net/Wonderful au123456.us.something.net/789/net/CaultonHex  | sed 's/au/cdn/; s/us.something.net/au.somewhereelse.com/'
cdn123456.au.somewhereelse.com/789/net/Wonderful
cdn123456.au.somewhereelse.com/789/net/CaultonHex

请注意,在正则表达式 us.something.net 中,点 . 代表 任何 字符。

$ echo au123456.us%something,net/789/net/Wonderful | sed 's/au/cdn/; s/us.something.net/au.somewhereelse.com/'
cdn123456.au.somewhereelse.com/789/net/Wonderful

使用 \. 转义点以仅匹配一个点:

sed 's/au/cdn/; s/us\.something\.net/au.somewhereelse.com/'

我个人更喜欢显式匹配模式,以及:

$ printf "%s\n" au123456.us.something.net/789/net/Wonderful au123456.us.something.net/789/net/CaultonHex  | sed 's@au\([0-9]\{6\}\)\.us\.something\.net/@cdn.au.somewhereelse.com@'
cdn123456.au.somewhereelse.com789/net/Wonderful
cdn123456.au.somewhereelse.com789/net/CaultonHex