使用更复杂的输入(注意 test3 中不需要的文本包含逗号):
test1:PAss,test2:FAil,test3:pass foobar, barfoo,test4:pass,test42:pass,test6:pass asfas
我会调用 3 次 sed 和 1 次 cut。第一次调用将它分成几行,第二个进行必要的更改,最后一个用<br> 加入行:
echo "test1:PAss,test2:FAil,test3:pass foobar, barfoo,test4:pass,test42:pass,test6:pass asfas" |
sed -e 's/,/\n/g' |
sed -e '/^test[0-9]/ ! d' \
-e 's/pass/Pass/i' \
-e 's/fail/Fail/i' \
-e 's/:/ # /' |
cut -d' ' -f 1-3 |
sed ':a; N; $!ba; s/\n/<br>/g'
或者如果要求只使用sed:
echo "test1:PAss,test2:FAil,test3:pass foobar, barfoo,test4:pass,test42:pass,test6:pass asfas" |
sed -e 's/,/\n/g' |
sed -e '/^test[0-9]/ ! d' \
-e 's/pass/Pass/i' \
-e 's/fail/Fail/i' \
-e 's/:/ # /' \
-e 's/\([[:alnum:]]* # [[:alnum:]]*\).*/\1/' |
sed ':a; N; $!ba; s/\n/<br>/g'
两种情况下的输出:
test1 # Pass<br>test2 # Fail<br>test3 # Pass<br>test4 # Pass<br>test42 # Pass<br>test6 # Pass
并且没有代码格式化:
test1 # Pass
test2 # Fail
test3 # Pass
test4 # Pass
test42 # Pass
test6 # Pass
-
/^test[0-9]/ ! d 删除不以 test[0-9] 开头的行。
-
s/pass/Pass/i 不区分大小写,因此它匹配任何“通过”并将其替换为“通过”。因此为“失败”。
-
s/\([[:alnum:]]* # [[:alnum:]]*\).*/\1/ 捕获由 # 分隔的 2 个单词,并将整行替换为此捕获的内容。
-
:a; N; $!ba; s/\n/<br>/g 取自 https://www.baeldung.com/linux/join-multiple-lines#sed。它定义标签a,将行追加到模式空间,最后将\n 替换为<br>。