我需要提取 和 之間的CAKE_FROSTING("
字串",
。如果字串跨越多行,則必須洗掉行更改處的引號和換行符。我有一個命令(感謝stackoverflow)在那個方向上做了一些事情,但不完全是。我該如何修復它(你能簡要解釋一下修復)嗎?我正在使用 Linux bash。
sed -En ':a;N;s/.*CAKE_FROSTING\(\n?\s*?"([^,]*).*/\1/p;ba' filesToCheck/* > result.txt
檔案檢查/file.h
something
CAKE_FROSTING(
"is supreme",
"[i][agree]") something else
something more
something else
CAKE_FROSTING(
"is."kinda" neat"
"in fact",
"[i][agree]") something else
something more
result.txt 當前
is supreme"
is."kinda" neat"
所需的結果.txt
is supreme
is."kinda" neat in fact
編輯:在@D_action 的幫助下,我現在有了
sed -En ':a;N;s/.*CAKE_FROSTING\(\n?\s*?"([^,]*).*,/\1/p;ba' filesToCheck/* > result.txt
這會產生幾乎正確的輸出,但是輸出中有不必要的引號和一個太多的換行符:
result.txt 當前
is supreme"
is."kinda" neat"
"in fact"
uj5u.com熱心網友回復:
使用 GNUsed
$ sed -En ':a;N;s/.*CAKE_FROSTING\(\n?\s"([^"]*[^\n,]*)["].*\n"([[:alpha:] ] )?.*/\1 \2/p;ba' input_file
is supreme
is."kinda" neat in fact
uj5u.com熱心網友回復:
您還可以使用perl
此處來匹配和之間的字串,CAKE_FROSTING(
并)
從行的開頭/結尾洗掉雙引號,并僅在匹配項內用空格替換換行符:
perl -0777 -ne 'while (/CAKE_FROSTING\(\s*"([^,]*)"/g) {$a=$1; $a =~ s/^"|"$|(\R )/$1?" ":""/gme; print "$a\n"}' file
請參閱在線演示。請注意,-0777
slurps 檔案以便正則運算式引擎可以“看到”換行符。
該CAKE_FROSTING\(\s*"([^,]*)"
模式匹配CAKE_FROSTING(
零個或多個空格,"
然后將任何零個或多個非逗號字符捕獲到第 1 組,直到最右邊"
。
這些$a=$1; $a =~ s/^"|"$|(\R )/$1?" ":""/gme; print "$a\n"
部分將第 1 組的值分配給一個$a
變數,^"|"$|(\R )
匹配"
位于行尾開頭的 s 或將一個或多個換行符 ( \R
) 捕獲到第 1 組中,如果第 1 組匹配,則替換為空格,否則,它是一個空字串。$a
僅列印變數的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/528899.html
標籤:正则表达式重击sed