Perl

使用 perl 或任何其他工具進行多行編輯

  • October 21, 2014

我正在編輯我的.uncrustify.cfg文件以使其更具可讀性。我只想像這樣重新格式化:

兩行:

# Add or remove between the parens in the function type: 'void (*x)(...)'
sp_after_tparen_close      = ignore   # ignore/add/remove/force

一條線:

sp_after_tparen_close      = ignore   # ignore/add/remove/force#   Add or remove between the parens in the function type: 'void (*x)(...)'

Perl 似乎是要走的路,但語法讓我不知所措。當我有空閒的十年時,我會學習它;-)

為了使它更通用:

兩行:

#a comment line
some code

一條線:

some code # a comment line

==========================

約翰:手工完成的兩行:

nl_while_brace             = ignore   # I,A,R,F     # Add or remove newline between 'while' and '{'
nl_scope_brace             = ignore   # I,A,R,F     # Add or remove newline between 'scope (x)' and '{' (D)

…沒有使用您的 awk 組合的兩對:

# Add or remove newline between 'unittest' and '{' (D)
nl_unittest_brace          = ignore   # I,A,R,F

# Add or remove newline between 'version (x)' and '{' (D)
nl_version_brace           = ignore   # I,A,R,F
sed '/^#/N;s/\(.*\)\n\([^#].*\)/\2 \1/;P;D'

這將處理您在問題中的簡單範例 - 任何註釋行,其後跟一行不是註釋且包含至少一個字元的行都將附加到它後面的行。

因此,通過它執行您的範例,輸出為:

sp_after_tparen_close      = ignore   # ignore/add/remove/force # Add or remove between the parens in the function type: 'void (*x)(...)'

通過它執行@John1024 的範例,輸出為:

#
# Some comments
#

sp_after_tparen_close      = ignore   # ignore/add/remove/force # Add or remove between the parens in the function type: 'void (*x)(...)'

some code #a comment line
more code

# comment one
# comment two
still more code # comment three

要處理這樣的情況,sed不需要循環。在這種情況下,唯一可能包含\newline 字元的行是以散列開頭的#行,因為這些行是唯一sed會添加一個的行。

sed遇到以雜湊開頭的行時,#它會拉入Next 輸入行並將其附加到模式空間。sed然後嘗試s///替換:

  • \(.*\)- 盡可能多地引用,\1緊隨其後的是……
  • \n- 一個換行符緊跟在…
  • \([^#].*\)- 至少一個不是#雜湊的字元以及模式空間中剩餘的所有內容……
  • \2 \1.

sed然後P將模式空間沖洗到第一個出現的\newline 字元並D刪除相同的字元,然後重新開始嘗試剩餘的內容*(如果有的話)*。

引用自:https://unix.stackexchange.com/questions/163212