Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Bash按模式将文件拆分为流_Regex_Bash_Sed - Fatal编程技术网

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秒猜一猜?