file - 我们如何使用内联文件选项运行 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
?谢谢
解决方案
有多种方法可以解决。如果没有明确需要三个单独的 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
推荐阅读
- php - 在php中分配对象
- html - 为什么在移动设备中我的 flex 样式会超出我的导航栏
- python - 找不到参考 - 同名的包和内包
- java - 使用 Java/VS Code 的两个问题
- android - Android 应用程序开发:帐户凭据和数据库备份
- d3.js - d3.js v5 - d3.json 在 Windows 上本地读取文件,但不在 linux 上?
- reactjs - Atom - ReactJS 组件编译为 JS 而不是 ES6
- r - 带有ggplot2的多面板图?
- php - 为什么这个 UPDATE 准备好的语句不起作用,但在 SQL db 中使用时起作用
- php - PHP OAuth签名与相同值的邮递员签名不匹配