Bash:提取行的部分并重写它们?
我有一行(这是更多相同内容列表的一部分)看起来像:Bash:提取行的部分并重写它们?,bash,string-matching,Bash,String Matching,我有一行(这是更多相同内容列表的一部分)看起来像: au123456.us.something.net/789/net/Wonderful 。。。等等 我想提取auXXXXXX部分中的6位数字,然后再抓取/后面的所有内容,这样我就可以将行重新写入: cdn123456.au.somewhereelse.com/789/net/Wonderful 这可能吗?我对替换要求和正则表达式感到困惑…:facepalm: 我使用的是: echo "au123456.us.something.n
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.somewhere.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
请注意,在regexus.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\1.au.somewhereelse.com@'
cdn123456.au.somewhereelse.com789/net/Wonderful
cdn123456.au.somewhereelse.com789/net/CaultonHex
因此,如果您不想在全球范围内执行此操作,请删除
g
标志。谢谢。我用了sed's@au\([0-9]\{6\}\.us\.something\.net/@cdn\1.au.somewhere.com/@'