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
我有一行(这是更多相同行的列表的一部分)看起来像:
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