我在使用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代替每一行的第一个字母。
谢谢你的帮助!
答案 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"];/'