使用 sed 將檔案中的所有行替換為行中第一次出現的模式

使用 sed 將檔案中的所有行替換為行中第一次出現的模式

是否可以在一根襯墊中完成?

我有這樣的輸出:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

此輸入是自動產生的。

我想將每行第一次出現的"(引號+空格)替換為"(引號)。如果我在全域範圍內套用替換,它也會更改每次出現的line" -to line"-,所以我想知道是否可以使用 sed oneliner 來完成此操作。

我嘗試過^這樣使用

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

但它不起作用,它不能取代任何東西。我試過

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

並且它取代了所有出現的情況。我剛開始使用 sed,所以我真的不知道我是否做錯了什麼。

我在這裡缺少什麼?

答案1

你想太多了。 sed預設僅替換行中的第一個實例(不含修飾符/g),儘管您仍然想要錨定,因為您不太需要行中的第一個實例,而是需要行開頭的實例;而且您通常不需要嘗試使用的顯式行操作(為什麼?)。

sed 's/^" /"/'

答案2

一個更一般的答案,因為我無法評論 geekosaur 的答案 - 你不會放置 ^ (行錨點的開頭)。例如,如果您想用 B 替換第一次出現的 A,您可以

sed 's/A/B/'

答案3

使用珀爾

~$ perl -pe 's/^" /"/;'   file 

使用(以前稱為 Perl_6)

~$ raku -pe 's/^\" \s /"/;'  file

輸入範例:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

範例輸出(兩個程式碼範例):

"First line" - Description  
"Second line" - Description  
"Third line" - Description  
"Fourth line" - Description  

https://perldoc.perl.org/perlre
https://perldoc.perl.org/perltrap#Sed-Traps
https://docs.raku.org/language/regexes

相關內容