首页 > 解决方案 > 我们如何使用内联文件选项运行 SED 而它必须有两次或更多的管道进程

问题描述

我们如何在许多管道上将 SED 作为内联文件选项

sed -i -E ':k /\b("[^"]+"\s*([A-z]\w*\s*)?)+,?\s*$/{N;s/\s*\n\s*/ /;
            s/\)\s*;/);\n/; bk}' uci.c \
| sed -E 's/\b\s*("[^%"]+")\s*\)\s*;/c\1;/' | sed -E 's/;/;;/'

以及如何通过指示 glob 在批处理文件中执行此操作uci*.c?谢谢

标签: filesed

解决方案


有多种方法可以解决。如果没有明确需要三个单独的 sed 进程,您可以将三个 sed 脚本合并为一个:

sed -i -E \
    ':k /\b("[^"]+"\s*([A-z]\w*\s*)?)+,?\s*$/{N;s/\s*\n\s*/ /;
     s/\)\s*;/);\n/; bk};s/\b\s*("[^%"]+")\s*\)\s*;/c\1;/;s/;/;;/' \
    uci.c

或使用多个脚本参数运行 sed:

sed -i -E \
    -e ':k /\b("[^"]+"\s*([A-z]\w*\s*)?)+,?\s*$/{N;s/\s*\n\s*/ /;
        s/\)\s*;/);\n/; bk}' \
    -e 's/\b\s*("[^%"]+")\s*\)\s*;/c\1;/' \
    -e 's/;/;;/' \
    uci.c

如果要保留管道,则必须明确使用某种临时文件:

tmpf="$(mktemp)"
sed -E ':k /\b("[^"]+"\s*([A-z]\w*\s*)?)+,?\s*$/{N;s/\s*\n\s*/ /;
        s/\)\s*;/);\n/; bk}' uci.c \
| sed -E 's/\b\s*("[^%"]+")\s*\)\s*;/c\1;/' \
| sed -E 's/;/;;/' > "$tmpf"
mv -f "$tmpf" uci.c

或隐含地,通过海绵之类的实用工具(来自moreutils):

sed -E ':k /\b("[^"]+"\s*([A-z]\w*\s*)?)+,?\s*$/{N;s/\s*\n\s*/ /;
        s/\)\s*;/);\n/; bk}' uci.c \
| sed -E 's/\b\s*("[^%"]+")\s*\)\s*;/c\1;/' \
| sed -E 's/;/;;/' \
| sponge uci.c

推荐阅读