有些行以 开头#
,然后是任何数字(一位或多位数字),然后是=
。以散列开头的那些行,删除从行首到等号(包括它)的文本。
文件中的示例:
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。
-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 允许#
评论之内正则表达式。 ]。