是否可以在一根衬垫中完成?
我有这样的输出:
"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