Perl
使用 perl 或任何其他工具進行多行編輯
我正在編輯我的
.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
不需要循環。在這種情況下,唯一可能包含\n
ewline 字元的行是以散列開頭的#
行,因為這些行是唯一sed
會添加一個的行。當
sed
遇到以雜湊開頭的行時,#
它會拉入N
ext 輸入行並將其附加到模式空間。sed
然後嘗試s///
替換:
\(.*\)
- 盡可能多地引用,\1
緊隨其後的是……\n
- 一個換行符緊跟在…\([^#].*\)
- 至少一個不是#
雜湊的字元以及模式空間中剩餘的所有內容……- 與
\2 \1
.
sed
然後P
將模式空間沖洗到第一個出現的\n
ewline 字元並D
刪除相同的字元,然後重新開始嘗試剩餘的內容*(如果有的話)*。