【发布时间】:2019-09-18 12:45:42
【问题描述】:
我正在尝试从一波 ovpn 文件中提取信息以更新我的服务器列表。我找到了一种使用 sed 提取信息的方法并且一切正常,但是当我尝试提取数据以制作目录结构时,我被卡住了。
我拥有的是文件夹内的文件,例如:
ch101.tcp443.ovpn
ch101.udp1194.ovpn
ch102.nordvpn.com.tcp443.ovpn
ch102.nordvpn.com.udp1194.ovpn
ch102.tcp443.ovpn
ch102.udp1194.ovpn
现在我想提取信息来制作目录结构,所以I made a regex来提取我需要的所有信息
它适用于我拥有的所有文件,并从文件名中获取数据。因此,它会从“ch101.udp1194.ovpn”中提取“ch101”和“udp”,并将其分为第 1 组和第 2 组。
但是当我尝试使它与 sed 一起工作时,我失败了。我试图将其分解为多个步骤,但即使只有第一组在寻找“ch101”,它也不起作用:
echo 'ch101.udp1194.ovpn' | sed -rn 's/^([a-z\-]+\d{1,4})/\1/p'
我错过了什么?我不是 sed 专家,但我发现类似的表达方式有效,但这个无效。
我的最终目的是创建目录并在其中存储我需要的所有信息,所以:
for i in /opt/ovpn/*.ovpn ; do
[ -f "$i" ] || continue
FIRST_ARG=$(echo $i | sed ...) # extract ch101
SECOND_ARG=$(echo $i | sed ...) # extract udp
FIRST_ARG_TEXT=$(echo $FIRST_ARG | sed ...) # extract text from FIRST_ARG
FIRST_ARG_NUM=$(echo $FIRST_ARG | sed ...) # extract num from FIRST_ARG
FIRST_ARG_NUM_4FORMAT=$(printf '%04i\n' $FIRST_ARG_NUM) # 4 digits for FIRST_ARG_NUM
mkdir /opt/somedir/$FIRST_ARG_TEXT$FIRST_ARG_NUM_4FORMAT$SECOND_ARG
cp ........
done
所以从 ch101.udp1194.ovpn 我将以一个名为的目录结束
ch0101udp
也许不是最好和最干净的方法,但对我来说似乎很简单,并且是我的知识所能达到的最大值
任何想法或问题对我都有好处
附言。我在busybox 1.30下,所以这一定是sh而不是bash
【问题讨论】:
-
Sed 不支持
\d。请改用[0-9]或[[:digit:]]。 -
我试过 echo 'it66.tcp443.ovpn' | sed -rn 's/^([a-z\-]+[0-9]{1,4})/\1/p' 没有运气,并且有 echo 'it66.tcp443.ovpn' | sed -rn 's/^([a-z\-]+[[:digit:]]{1,4})/\1/p' 没有运气。我想我做错了
-
@miken32 可以作为一个很好的起点,问题是当你发现这个 ch-onion1.nordvpn.com.tcp443.ovpn print $2 return nordvpn 而不是协议时
标签: regex parsing sed string-formatting