1

sed用来将文件的内容连接为:

    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替代品完美地完成了这项工作。

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

4

4 回答 4

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}'
于 2012-07-02T12:52:01.013 回答
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 (***)
于 2012-07-02T12:55:52.637 回答
1
your_pipeline | awk 'BEGIN{RS="\\| |\n";ORS="\n"}1'

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

于 2012-07-02T15:41:00.523 回答
0

你为什么还要为此烦恼 sed/awk?如果我正确阅读了这个问题,您只想删除所有换行符并将所有换行符替换|为换行符。

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

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

 < source.c tr -d \\n | tr \| \\n; echo
于 2012-07-03T13:33:46.503 回答