第一个问题:只有当 grep 采用这样的常量模式时,我的代码才能工作:
echo "$s" | grep -oP '(?<=class="A3">).*(?=</a>)'
第二个问题:将输出分配给一个不起作用的变量
这是我的脚本:
#!/bin/sh
filename="data.txt"
Ptr_ValidChannel="><a title="Id: "
Ptr_ChannelNameStart="<class="A3">"
Ptr_ChannelNameEnd="</a>"
while read -r line
do
case "$line" in
# working 100%
#*$Ptr_ValidChannel*) echo "$line" | grep -oP '(?<=class="A3">).*?(?=</a>)' ;;
# not working
#*$Ptr_ValidChannel*) echo $line | grep -oP '(?<=$Ptr_ChannelNameStart).*?(?=$Ptr_ChannelNameEnd)' ;;
# not working
*$Ptr_ValidChannel*) myvar=$(echo $line | grep -oP '(?<=$Ptr_ChannelNameStart).*?(?=$Ptr_ChannelNameEnd)') ;;
esac
done < "$filename"
echo $var_name
exit
为了简化数据.txt内容是:
<TD WIDTH="15%"><a title="Id: I24 NEWS" class="A3">I24 News Français</a><br /><font color="#555555"> <a title="Sporadic or full 16/9 transmission"><img src="/169.gif"></a>
在我的系统中,命令:
ls -la /bin/sh
输出为 :
/bin/sh -> dash
此致敬意。
附言请不要使用BASH代码。只有SH。
看完这篇文章: dash as bin sh. 我想出了如何让我的代码正常工作且更具可移植性:
#! /bin/sh
filename='data.txt'
Ptr_ValidChannel='><a title="Id: '
Ptr_ChannelNameStart='class="A3">'
Ptr_ChannelNameEnd='</a>'
while read -r line
do
case "$line" in
*"$Ptr_ValidChannel"*) var_name=$(printf %s "$line" | grep -oP '(?<='"$Ptr_ChannelNameStart"').*?(?='"$Ptr_ChannelNameEnd"')'); printf %s "$var_name"; printf 'n'; ;;
esac
done < "$filename"
exit
感谢您的评论
最好的雷格德。