我正在使用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/ *//'
sed
和awk
替代方案可以完美地完成工作。
在第一次编辑时根据upvotes选择的答案:)。
正如其中一个答案中所建议的那样,我将问题保持不变,以便其他人找到这些简单的替代方案而不是弄乱IFS
。
答案 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