0

我需要使用此 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

等等

我怎样才能得到完整的线路,只需将 13m5s 更改为 00:13:5 ?

如果只是在没有 grep 的 while 循环之后使用 sed 它会更改错误的字母。并将 00: 放在每一行的开头。

处理这个问题的最佳方法是什么。我认为将命令集成到现有循环中是最好的。但我尝试了许多不同的变化而没有结果。

谢谢帮助

谢谢

4

2 回答 2

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/'
于 2013-10-05T01:45:21.997 回答
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

回答您关于如何上交的具体要求的行13m5s00:13:05以下两条:

IFS='ms' read min sec <<<"$time"

printf '%s|%s|00:%02d:%02d|%s\n' "$iframe" "$files" "$min" "$sec" "$base_url"

read行用于IFS告诉它拆分字符ms使其能够轻松读取分钟和秒变量。

具体而言,该printf行将和变量00:%02d:%02d格式化为用零填充的两位数。$min$sec

于 2013-10-05T02:40:08.127 回答