2012-09-17 72 views
0

我命令這一行:如何最後一行從數據流命令行刪除

xclip -o -sel clip | sed -e 's/^ *"\(.*\)"+\?/\1/g' | tr -d '\n' | 
    sed -e 's/.\{,55\}/"&"+\n/g' | 
    sed -e "2,$ s/^/$(seq 22 | xargs -I{} echo -n ' ')/" | 
    sed -e '$ s/+$//' | xclip -sel clip 

的格式字符串中的源代碼(我用它來格式化JavaScript文件長字符串 - 55和22 harcoded寬度和縮進)

var foo = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"+ 
      ". Nulla sed dolor nisl, in suscipit justo. Donec a enim"+ 
      " et est porttitor semper at vitae augue. Proin at nulla"+ 
      " at dui mattis mattis. Nam a volutpat ante. Aliquam con"+ 
      "sequat dui eu sem convallis ullamcorper." 

但是當我複製過去的代碼括號內var foo = foo.bar()我得到這個

var foo = foo.bar("Lorem ipsum dolor sit amet, consectetur adipiscing elit"+ 
        ". Nulla sed dolor nisl, in suscipit justo. Donec a enim"+ 
        " et est porttitor semper at vitae augue. Proin at nulla"+ 
        " at dui mattis mattis. Nam a volutpat ante. Aliquam con"+ 
        "sequat dui eu sem convallis ullamcorper." 
) 

最後一個報價後的新行,不是大問題,但任何人都知道如何刪除最後一行新行?

回答

3

這裏有一種方法,使用awk。將RS(記錄分隔符)設置爲空字符串可告知awk將空行(即兩個連續的\n)作爲記錄分隔符。將FS設置爲\n會導致awk\n作爲字段分隔符而不是空格。 (將RS設置爲空字符串也會導致\n被用作字段分隔符,但我們希望避免識別其他空格)。最後,我們將OFS(輸出字段分隔符)設置爲我們想要的行之間的字符串(結束引號,加上換行符,22個空格,打開報價),並將ORS(輸出記錄分隔符)設置爲空字符串,導致awk不在末尾寫入任何換行符。

我用fold分割線爲55字節塊,而不是sed的,部分是因爲它看起來更整潔,部分是因爲,不像sed,它不會在輸入結束時,如果有WASN添加一個新行沒有人可以從頭開始。

表面上多餘的$1=$1導致awk重新創建$0,其效果是使用OFS作爲字段之間的輸出字段分隔符。否則,它僅用於分隔單獨的打印參數。

第一行和最後一行與OP保持不變。

xclip -o -sel clip | sed -e 's/^ *"\(.*\)"+\?/\1/g' | tr -d '\n' | 
fold -b -w55 | 
awk -vFS=$'\n' -vOFS="$(printf '"+\n%22s"' '')" \ 
    -vRS='' -vORS='' \ 
    '{$1=$1; print "\"" $0 "\""}' | 
xclip -sel clip 
+0

太棒了,我從來不用awk很多,需要仔細看看它。並且感謝'fold'我正在尋找這個命令,但認爲它被稱爲'cols'什麼的。 – jcubic