根据IFS格式化文件

时间:2012-07-02 12:40:31

标签: regex bash sed awk

我正在使用sed将文件的内容连接为:

    cat source.c |  sed -e :a -e '$!N; s/\n/ /; ta'

该文件包含由管道|分隔的相关信息[字符串系列]。 我想将IFS更改为管道|并获取输出可以通过管道传输到新IFS,从而将新格式化的文件显示到stdout。

串联后的source.c实例:

    void f0 (***) | void f1 (***) | void f2 (***)| void f3 (***) 

我希望通过设置IFS

来实现
    void f0 (***)
    void f1 (***)
    void f2 (***)
    void f3 (***) 

提前感谢回复。我不确定文件是否可行,我不想在这里涉及变量或数组。

编辑:源文件在开头就出现了类似的内容:

    void 
          f0 
         (***) |
    void 
               f1
                              (***) |
                   void                   f2                    (***) |
    void             f3                                                (***)   

首先我连接然后我将每个单词组加倍空格,然后使用管道作为分隔符进行拆分。

sed -e :a -e '$!N; s/\n/ /; ta' source.c | sed -e 's/  */  /g' -e 's/ *//'

sedawk替代方案可以完美地完成工作。

在第一次编辑时根据upvotes选择的答案:)。 正如其中一个答案中所建议的那样,我将问题保持不变,以便其他人找到这些简单的替代方案而不是弄乱IFS

4 个答案:

答案 0 :(得分:3)

如果这正是您想要的,只需替换'|'换行。

echo 'void f0 (***) | void f1 (***) | void f2 (***)| void f3 (***) ' | sed 's, *| *,\n,g'

或者使用您的命令:

sed -e :a -e '$!N; s/\n/ /; ta' source.c | sed 's, *| *,\n,g'

与shell的IFS混淆会让你遇到非常模糊的问题。尽管如此,与awk混淆不是问题:

echo 'void f0 (***) | void f1 (***) | void f2 (***)| void f3 (***) ' | awk 'BEGIN {RS="|";} { print $0}'
sed -e :a -e '$!N; s/\n/ /; ta' source.c | awk 'BEGIN {RS="|";} { print $0}'

答案 1 :(得分:3)

$ cat source.c | awk 'BEGIN{ RS="|" } {$1=$1; print $0}'

如果将连接的输出传递给此awk脚本,它会将管道分隔符更改为换行符。


$ cat test
void f0 (***) | void f1 (***) | void f2 (***)| void f3 (***)

$ cat test | awk 'BEGIN{ RS="|" } {$1=$1; print $0}'
void f0 (***)
void f1 (***)
void f2 (***)
void f3 (***)

答案 2 :(得分:1)

your_pipeline | awk 'BEGIN{RS="\\| |\n";ORS="\n"}1'

输入记录分隔符是文字管道,后跟空格或换行符。输出记录分隔符是换行符。 1为“true”,导致$0被打印。

答案 3 :(得分:0)

为什么你甚至为sed / awk打扰?如果我正确阅读了问题,您只想删除所有换行符,并用换行符替换所有|

tr -d \\n | tr \| \\n

如果您的输入文件未以|结尾,则不会打印终止换行符;在这种情况下,整体命令应该是:

 < source.c tr -d \\n | tr \| \\n; echo