![使用 sed 將檔案中的所有行替換為行中第一次出現的模式](https://rvso.com/image/22256/%E4%BD%BF%E7%94%A8%20sed%20%E5%B0%87%E6%AA%94%E6%A1%88%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C%E6%9B%BF%E6%8F%9B%E7%82%BA%E8%A1%8C%E4%B8%AD%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%87%BA%E7%8F%BE%E7%9A%84%E6%A8%A1%E5%BC%8F.png)
是否可以在一根襯墊中完成?
我有這樣的輸出:
"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