我想在 sed script 中使用 sed 洗掉括號內的文本(包括括號)。例如,我想洗掉短語 (Chris Pratt) 和 (Chris-Pratt) 并保留 (Chris_Pratt)。(它們都在同一條線上)。并對整個檔案執行此操作。例如,該行如下所示:
Star Lord (Chris Pratt), (Chris-Pratt), age 42, actor, (Chris_Pratt)
這就是在 sed 腳本中的 sed 命令之后我想要的樣子:
Star Lord, age 42, actor, (Chris_Pratt)
這就是我想要對每一行做的事情(有多行具有其他名稱)。
我已經嘗試過:
s/[(][^)]*[)]//g
這個有效,但它也會洗掉包括下劃線在內的括號,還有:
s/\([[:alpha:]]{1,} [[:alpha:] ]{1,}\)\ //g
當我在命令列中使用 sed 正常運行它時,這個確實有效,但是當我出于某種原因在腳本中運行它時它不起作用。
uj5u.com熱心網友回復:
您可以使用
sed 's/ *([^()_]*)//g' file > outputfile
與 POSIX ERE 語法相同的模式:
sed -E 's/ *\([^()_]*\)//g' file > outputfile
詳情:
*(- 文字(字符(因為它是 POSIX BRE 模式),當使用 POSIX ERE 時,\(必須使用[^()_]*-比其他零個或多個字符(,)并_)-)在使用 POSIX ERE 時,\)必須使用文字字符(因為它是 POSIX BRE 模式)。
請參閱
uj5u.com熱心網友回復:
第一個解決方案(sed解決方案):使用您顯示的示例,請嘗試以下sed程式。sed在此處使用的反向參考功能。
sed -E 's/(^[^(]*) \([^)]*\), \([^)]*\)(.*)/\1\2/' Input_file
說明:使用sed's-E選項在我們的程式中啟用 ERE(擴展正則運算式)。然后在主程式中使用 的s選項sed來執行替換操作。我們提到的(^[^(]*) \([^)]*\), \([^)]*\)(.*)是在這里創建 2 個反向參考(記憶體中的一個臨時空間,用于稍后在程式中檢索捕獲的值)。替換 using\1(first backreference) 和\2(2nd back reference) 來獲得 OP 提到的預期輸出。
正則運算式說明:
(^[^(]*) ##Creating 1st capturing group which captures values from starting of line to till 1st occurrence of ( here.
\([^)]*\), \([^)]*\) ##Matching space ( till next occurrence of ) here followed by comma then space followed by ( till next occurrence of ).
(.*) ##Creating 2nd capturing group which has everything after previous match.
第二個解決方案(awk解決方案):添加了一個awk解決方案在這里,使用match的功能awk。使用的正則運算式與上面提到的相同,因此對該程式的簡單解釋是;通過此功能匹配不需要的部分并僅列印需要的部分。
awk '
match($0,/[[:space:]]*\([^)]*\),[[:space:]]*\([^)]*\)/){
print substr($0,1,RSTART-1) substr($0,RSTART RLENGTH)
}
' Input_file
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed -E ':a;s/ *\([^()]*\),(.*\(.*\))/\n\1/;ta;s/,*\n /,/g' file
,用一個換行符替換括號內的所有文字(包括括號),前面是一個可能的空格,后跟一個,后跟括號內的至少一個文字。
然后,用一個,.
uj5u.com熱心網友回復:
使用 sed
$ sed 's/,\? ([^)][A-Za-z -]*)//g' input_file
Star Lord, age 42, actor, (Chris_Pratt)
uj5u.com熱心網友回復:
您應該澄清您是否實際使用了“擴展”正則運算式的-E選項。
隨著-E上,括號(())必須進行轉義(\()來匹配字面上。沒有轉義,它們被解釋為組/欄位分隔符(沒有-E這個則相反)。
我的解決方案假設-E已開啟。
對于可執行
sed腳本,您的shebang 應該類似于#!/bin/sed -Ef或#!/usr/bin/env -Ssed -Ef對于不可執行的
sed腳本,呼叫它:sed -Ef my-script
解決方案:
如果所有行都具有相同的布局,請使用以下命令:
s/([[:space:]] \([^)] \),){2}/,/
如果布局不同,請嘗試以下這些:
s/[[:space:]]*\([^)]*[- ][^)] \)//
s/[[:space:]]*\([^)]*[- ][^)] \),?//g
所有包含空格和/或破折號的括號欄位都將被洗掉,還包括前導空格和尾隨逗號(如果存在)。僅對于第一次匹配,保留任何逗號。
s/[[:space:]]*\([^)_] \)//
s/[[:space:]]*\([^)_] \),?//g
洗掉所有不包含下劃線的括號欄位(包括(Madonna))。同上(如上)與空格和逗號。
編輯:我稍微誤讀了您的預期輸出。你會得到Star Lord age 42, actor, (Chris_Pratt)而不是Star Lord, age 42, actor, (Chris_Pratt)(注意第一個逗號)。我相應地修復了解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/339730.html
