2012-07-02 40 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