我需要使用这个while循环更改某些行的另一种格式。
while IFS= read -r line;
do
var=$(echo "$line" | grep -oE "http://img[0-9].domain.xy/t/[0-9][0-9][0-9]/[0-9][0-9][0-9]/" | uniq);
echo "$line" | sed -e 's|http://img[0-9].domain.xy/t/[0-9][0-9][0-9]/[0-9][0-9][0-9]/||g' -e "s|.*|&"${var}"|g" >> newFile;
done < file;
更改此格式
<iframe src="http://domain.xy/load.php?file=2259929" frameborder="0" scrolling="no"></iframe>|http://img9.domain.xy/t/929/320/1_2259929.jpg;http://img9.domain.xy/t/929/320/2_2259929.jpg;http://img9.domain.xy/t/929/320/3_2259929.jpg;http://img9.domain.xy/t/929/320/4_2259929.jpg;http://img9.domain.xy/t/929/320/5_2259929.jpg;http://img9.domain.xy/t/929/320/6_2259929.jpg;http://img9.domain.xy/t/929/320/7_2259929.jpg;http://img9.domain.xy/t/929/320/8_2259929.jpg;http://img9.domain.xy/t/929/320/9_2259929.jpg;http://img9.domain.xy/t/929/320/10_2259929.jpg|13m5s
并给我输出。
<iframe src="http://domain.xy/load.php?file=2259929" frameborder="0" scrolling="no"></iframe>|1_2259929.jpg;2_2259929.jpg;3_2259929.jpg;4_2259929.jpg;5_2259929.jpg;6_2259929.jpg;7_2259929.jpg;8_2259929.jpg;9_2259929.jpg;10_2259929.jpg|13m5s|http://img9.domain.xy/t/929/320/
一切正常!!!
但是我还想要改变一个时间值。 13m5s到00:13:5或更好13m5s到00:13:05
我尝试在循环结束时使用另一个grep + sed命令。
while IFS= read -r line;
do
var=$(echo "$line" | grep -oE "http://img[0-9].domain.xy/t/[0-9][0-9][0-9]/[0-9][0-9][0-9]/" | uniq);
echo "$line" | sed -e 's|http://img[0-9].domain.xy/t/[0-9][0-9][0-9]/[0-9][0-9][0-9]/||g' -e "s|.*|&"${var}"|g" >> newFile;
done < file;
grep -oE "[0-9]*m[0-9]*[0-9]s" newFile | sed -e 's|^|00:|' -e s'|m|:|' -e s'|s||'
这只给出了数字的输出而不是整行。
00:13:5
00:3:18个
00:1:50
等等
我怎样才能获得满分并将13m5更改为00:13:5?
如果只是在没有grep的while循环后使用sed,则更改错误的字母。并将00:放在每一行的开头。
处理它的最佳方法是什么。我认为最好将命令集成到现有循环中。但是我已经尝试了许多不同的变化而没有结果。
thx for help
THX
答案 0 :(得分:1)
grep
仅输出与表达式匹配的行。使用sed的内置行匹配来限制替换为某些行:
sed '/[0-9]*m[0-9]*[0-9]s/{s|^|00:|;s|m|:|;s'|s||;}'
或者这个:
sed 's/\([0-9]*\)m\([0-9]*[0-9]\)s/00:\1:\2/'
答案 1 :(得分:1)
我将你的代码分成几个部分,以便更容易理解发生的事情。这是我认为正确的结果:
# Read each field in to separate variables
while IFS='|' read iframe urls time; do
# Get the first URL from the ';'-separated list
url="${urls%%;*}"
# Get the base URL by matching up to the last '/' (and add it back since the match is exclusive)
base_url="${url%/*}"'/'
# Remove the base URL from the list of full URLs so only the filenames are left
files="${urls//$base_url/}"
# Parse the minute and second out from the '##m#s' string
IFS='ms' read min sec <<<"$time"
# Print the new line - note the numeric formatting in the third column
printf '%s|%s|00:%02d:%02d|%s\n' "$iframe" "$files" "$min" "$sec" "$base_url"
done <file
回答您关于如何将13m5s
转入00:13:05
的特定请求的行是这两行:
IFS='ms' read min sec <<<"$time"
printf '%s|%s|00:%02d:%02d|%s\n' "$iframe" "$files" "$min" "$sec" "$base_url"
read
行使用IFS
告诉它分割字符m
或s
,使其能够轻松读取分钟和秒变量。
具有printf
的{{1}}行专门将00:%02d:%02d
和$min
变量格式化为零填充的两位数字。