Regex Bash按模式将文件拆分为流
我想拆分一个文件,例如:Regex Bash按模式将文件拆分为流,regex,bash,sed,Regex,Bash,Sed,我想拆分一个文件,例如: #define MACRO "exists" code *code(code code, code code_code) { code more_code; return more_code; } #define THING // etc 分为两个流,在重新组合之前,我可以使用其他实用程序对其进行操作-即,使用特定命令根据模式修改某些行,以及使用不同命令修改与模式不匹配的行 我想这需要使用命名管道 我当前的方法读取文件两次,并使用grep过滤行: FIL
#define MACRO "exists"
code *code(code code, code code_code) {
code more_code;
return more_code;
}
#define THING
// etc
分为两个流,在重新组合之前,我可以使用其他实用程序对其进行操作-即,使用特定命令根据模式修改某些行,以及使用不同命令修改与模式不匹配的行
我想这需要使用命名管道
我当前的方法读取文件两次,并使用grep过滤行:
FILE="example.txt"
grep '^#' < "$FILE" | cpp -P > combined.txt
grep -v '^#' < "$FILE" | awk '{ print $4 }' >> combined.txt
FILE=“example.txt”
grep'^#'<“$FILE”| cpp-P>combined.txt
grep-v'^#'<“$FILE”| awk'{print$4}'>>combined.txt
有没有办法使用
sed
或其他实用程序按模式分割文件?您可以浏览一次文件,对匹配或不匹配的行执行不同的操作:
awk '/^#/ {system("echo \"=== "$0"\"")}
!/^#/ {system("echo \"+++ "$0"\"")}
' example.txt
每条线路的呼叫系统开销很大,所以尽量使用awk函数
编辑:
我不明白为什么文件分为两个流,cpp希望解析一个完整的文件<代码>回显“#定义宏“存在”| cpp-P为。
当你有
#ifdef NOTVALID
ignore these lines
#endif
我认为cpp需要看到第二行。我试着打电话
awk -v q=\' 'BEGIN {FS=" ";} /^#/ {cmd="echo "q$0q"|cpp -P"; system(cmd)}
!/^#/ {system("echo \"+++ "$0"\"")}
' example.txt
但这对你没有用
在使用其他实用程序时,或许可以排除^#
行:
sed '/^[^#]/ s/e/===replaced the first e in the line by this line===/' example.txt
不需要命名为管道。可以通过一些命名文件来解决。是的,但是你必须通过文件系统。对于较大的文件来说,优化程度较低。管道的处理方式基本相同。无论如何,现代的实现不太可能将大部分数据写入磁盘,而大部分数据都在缓存中,除非文件很大(>2G);执行,然后快速地在线处理grep。再加上@A.Danischewski的想法,这可能会有帮助:比两次读取和过滤整个文件的开销更大?我需要其中一个流的c预处理器。你为什么要使用
system
?使用awk
中的print
功能。Imy原始答案使用系统显示如何调用系统命令,如cpp
,持续一行。但是,为一行调用cpp是没有用的。当您需要在没有预处理器的情况下调用不同的实用程序时,请完全在awk end内部或外部执行,并通过cpp重定向结果。@WalterA我滥用c预处理器进行宏替换,但没有其他操作。最后,我将所有的定义重新定位到文件的顶部,这是我提出这个问题的初衷。在这种情况下,您最初的方法似乎是最好的。您可以使用awk并将^#
行写入另一个流(stderr?),但您希望将它们附加到宏流的输出。您如何知道输出流已完成?用睡眠5秒猜一猜?