如果行以一个字符开头,则删除文本,直到同一行中出现另一个字符

如果行以一个字符开头,则删除文本,直到同一行中出现另一个字符

有些行以 开头#,然后是任何数字(一位或多位数字),然后是=。以散列开头的那些行,删除从行首到等号(包括它)的文本。

文件中的示例:

some text
#5=get('data');
;done;

输出文件:

some text
get('data');
;done;

答案1

sed 's/^#[[:digit:]]\{1,\}=//' < file.in > file.out

对于大多数sed实现,您可以使用该-E选项来获取扩展的正则表达式,其中\{1,\}可以替换为+

sed -E 's/^#[[:digit:]]+=//' < file.in > file.out

[[:digit:]]匹配在您的区域设置中分类为十进制数字的字符。在 GNU 系统上,它始终与[0123456789].在其他情况下,它可以匹配其他十进制数字(除了 0123456789 之外)。请注意,[0-9]匹配的内容通常有点随机,但始终包含 0123456789 并且不包含其他 ASCII 字符。如果有疑问并且您想严格匹配什么,请使用[0123456789]

或者你可以使用perl

perl -pe 's/^#\d+=//' < file.in > file.out

\d仅匹配,[0123456789]除非您传递该-C选项,在这种情况下,它会将输入解释为 UTF-8 编码(只要区域设置使用 UTF-8),并匹配 Unicode 分类为十进制数字的字符,例如 0123456789٠١٢٣٤٥٦٧٨٩0123456789 ໐໑໒໓໔໕໖໗໘໙

答案2

使用awk

$ awk '{sub(/^#[[:digit:]]+=/, "")}1'

使用pcregrep

$ pcregrep -o2 '(^#\d+=)?(.*)' file

-o2打印第二个捕获的组(.*)

所有的正则表达式都归功于@StéphaneChazelas。

pcregrep手动的:

-o数字,--仅匹配=number 仅显示与给定数字的捕获括号匹配的行部分。

答案3

使用(以前称为 Perl_6)

~$ raku -pe 's/^ "#" \d+ \= //;'  file.txt

或者:

~$ raku -pe 's/^ 「#」 \d+ \= //;'  file.txt

上面是用 Raku(Perl 编程语言家族的成员)编写的答案。基本上我已经采用了 @StéphaneChazelas 的优秀 Perl 答案并将其翻译成 Raku。

Raku 有一个新的正则表达式引擎,许多人发现它更容易理解/使用。例如,上面的各个正则表达式“原子”可以用空格自由分隔(这显然相当于 Perl 的/x选项)。此外,\d(简写)形式包括Unicode 数字,因此如果您只需要 ASCII 数字,请使用[<:ASCII> & <:N>](Unicode) 形式或<[0..9]>(自定义字符类)形式。

输入示例:

some text
#5=get('data');
;done;

示例输出:

some text
get('data');
;done;

关于转义字符的注释: 全部Raku 正则表达式中的非alnum字符需要转义或引用才能被理解为文字(考虑alnum诸如\.\*\+等非文字,并想象其余的非alnum字符保留供将来元字符使用)。

[警告:这里似乎#需要"…"「…」引用 octothorpe 字符。反斜杠转义似乎在我手中不起作用,可能是因为 Raku 允许#评论之内正则表达式。 ]。

https://docs.raku.org/language/regexes
https://raku.org

相关内容