使用sed更改输出文本

时间:2014-03-25 12:14:23

标签: bash text sed

我在使用sed在BASH中格式化文本时遇到问题。 这是输入文件:

recfun.o -> timeout.o (set_timeout)
recursive.o -> timeout.o (timeout)
print_recursive.o -> recursive.o (ackermann)
rec-nam.o -> timeout+.o (timeout)

这个shloud是输出:

recfunDo -> timeoutDo [label="set_timeout"];
recursiveDo -> timeoutDo [label="timeout"];
print_recursiveDo -> recursiveDo [label="ackermann"];
rec_namDo -> timeoutPDo [label="timeout"];

这意味着:

替代: " - "为" _",然后"。"为" D",然后" +"对于" P",但不要替代" - >"为" _>"

我用过这样的sed:

sed -e 's/./D/' file | sed -e 's/+/P/' | sed -e 's/-/_/'

但它返回相同的输出,只用D代替每一行的第一个字母。

谢谢你的帮助!

3 个答案:

答案 0 :(得分:3)

.匹配模式中的任何字符,因此它总是更改第一个字母。将其转义为\.会有所帮助。完整的命令:

sed 's/\./D/g; s/+/P/g; s/-\([^>]\)/_\1/; s/(/[label="/; s/)/"];/' myfile 
recfunDo -> timeoutDo [label="set_timeout"];
recursiveDo -> timeoutDo [label="timeout"];
print_recursiveDo -> recursiveDo [label="ackermann"];
rec_namDo -> timeoutPDo [label="timeout"];

正如Trenin在评论中指出的那样,用;分隔的多个命令在这里分组为一个sed脚本。部分s/-\([^>]\)/_\1/使用以\(...\)表示的编号组(在替换部分中将其称为\1)和组内的字符类:[^>]。这匹配除>之外的任何字符。

答案 1 :(得分:0)

您需要转义.

sed -e 's/\./D/g' file

答案 2 :(得分:0)

Perl的正则表达式很方便:

perl -pe 'tr/.+/DP/; s/-(?!>)/_/g; s/\((.+?)\)$/[label="$1"];/'