我有一个看起来像这样的文件
#define PIOMUX2_UART_3_RXD CONFIG_PIO31_5_SELECTOR, ALT_2, CONFIG_SYSCFG_PIO31_5_OE, I
#define PIOMUX2_UART_3_TXD CONFIG_PIO31_6_SELECTOR, ALT_2, CONFIG_SYSCFG_PIO31_6_OE, O
#define PIOMUX2_UART_3_CTS CONFIG_PIO31_7_SELECTOR, ALT_1, CONFIG_SYSCFG_PIO31_7_OE, I
我需要得到像
#define PIOMUX2_UART_3_RXD CONFIG_PIO31_5_SELECTOR
#define PIOMUX2_UART_3_TXD CONFIG_PIO31_6_SELECTOR
#define PIOMUX2_UART_3_CTS CONFIG_PIO31_7_SELECTOR
我试过这个:
open my $fh, '>', 'perl_script_3_out_1.txt' or die $!;
while (<$fh>)
{
s/^ALT//g;
s/^CONFIG_SYS//g;
s/,//g; print $_;
}
close($fh);
答案 0 :(得分:2)
您的主要问题是您正在以写入模式('>'
)打开文件,但之后尝试从中读取文件(<$fh>
。)
你的第二个问题是你将替换正则表达式锚定到行的开头(s/^...
),但是没有输入行以ALT或CONFIG_SYS开头,因为它们都以#define开头。
尝试这样的事情:
#!/usr/bin/env perl
use strict;
use warnings;
open my $fh, '<', 'input.txt' or die $!;
while (<$fh>) {
s/,.+//;
print;
}
close $fh;
运行方式如下:
alex@yuzu:~$ perl stack.pl
#define PIOMUX2_UART_3_RXD CONFIG_PIO31_5_SELECTOR
#define PIOMUX2_UART_3_TXD CONFIG_PIO31_6_SELECTOR
#define PIOMUX2_UART_3_CTS CONFIG_PIO31_7_SELECTOR
答案 1 :(得分:1)
试试这个。
简单的grep
功能就足够了。
open my $handle, '<', 'file.txt' or die $!;
my @ar = grep{~s/,.+//g} <$handle>;
print @ar;
答案 2 :(得分:0)
试试这个:
# cat test
#define PIOMUX2_UART_3_RXD CONFIG_PIO31_5_SELECTOR, ALT_2, CONFIG_SYSCFG_PIO31_5_OE, I
#define PIOMUX2_UART_3_TXD CONFIG_PIO31_6_SELECTOR, ALT_2, CONFIG_SYSCFG_PIO31_6_OE, O
#define PIOMUX2_UART_3_CTS CONFIG_PIO31_7_SELECTOR, ALT_1, CONFIG_SYSCFG_PIO31_7_OE, I
# perl -a -F, -lne 'print $F[0]' test
#define PIOMUX2_UART_3_RXD CONFIG_PIO31_5_SELECTOR
#define PIOMUX2_UART_3_TXD CONFIG_PIO31_6_SELECTOR
#define PIOMUX2_UART_3_CTS CONFIG_PIO31_7_SELECTOR
有关perl命令行参数说明,请参阅:https://blogs.oracle.com/ksplice/entry/the_top_10_tricks_of
@ Grace90,对于给定的样本数据,从列的角度查看文件。另外,请考虑所有这些列都用逗号分隔。因此,简而言之,您要提取文件的第一列,其列以逗号分隔。
所以对于上面的命令行:
-F,
将逗号定义为字段分隔符。
分割文件的每一行后,它将保存在数组F
中。
然后我只打印此数组的第一个元素$f[0]
答案 3 :(得分:0)
您可以在命令行中解决它:
perl -p -i.bak -e "s/([^,]+),.*/$1/" my_data_file.txt
这会更改您的数据文件(my_data_file.txt),并创建备份(my_data_file.bak)
答案 4 :(得分:-2)
通过使用split
功能,您也可以获得输出。
use warnings;
use strict;
open my $fh, '<', 'file.txt' or die $!;
while (<$fh>)
{
my @data = split(',', $_);
print "$data[0]\n";
}
close($fh);