2012-07-02 41 views
1

文件我使用sed来连接文件的内容为:格式基础上,IFS

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

该文件包含相关信息[系列串]通过管道|分离。 我想将IFS更改为管道|,并且可以通过管道将输出传递到新的IFS,从而向标准输出显示新格式的文件。

拼接后由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混淆。

+0

如果输入到'sed'是“每行一个功能”,并从过程所需输出的是“每行一个功能”,你为什么穿通'将文件中的所有功能拼合成一行'的中间阶段?从表面上看,您似乎希望将输入格式作为输出格式。 –

+1

他在最初的换行符上是扁平化的,并且希望管道符号替换它们,所以除非它们处于行结尾或行首,否则结果将会有很大不同。 – lynxlynxlynx

+0

@JonathanLeffler我编辑了这篇文章,让它更清晰一点 – Gil

回答

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' 

与外壳的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}' 
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 (***) 
+0

漂亮的修剪技巧! – lynxlynxlynx

+0

谢谢。是的,当字段被“修改”时,awk只刷新'$ 0',所以如果你触摸'$ 1',那么它会修剪无关的空白。 – vergenzt

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

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

0

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

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

如果你的输入文件不|结束,这将不打印终止换行符;在这种情况下,整体的命令应该是:

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