【问题标题】:Print each line of a file打印文件的每一行
【发布时间】:2019-02-26 11:19:01
【问题描述】:

我有一个文件 test.txt,内容如下:

one
two
three

现在,我想按如下方式打印该文件的每一行:

.one (one)
.two (two)
.three (three)

我在 Perl 中试试这个:

@ARGV = ("test.txt");
while (<>) {
    print (".$_ \($_\)");
}

这似乎不起作用,这就是我得到的:

.one
 (one
).two
 (two
).three
 (three
)

有人能帮我找出问题所在吗?


更新: 感谢 Aureliano Guedes 的建议。
这个 1-liner 似乎工作: perl -pe 's/([^\s]+)/.$1 ($1)/'

【问题讨论】:

  • @Biffen 请不要在 cmets 中回答。

标签: perl


【解决方案1】:

$_ 将包含换行符,例如one\n,所以print ".$_ \($_\)" 变成了print ".one\n (one\n)

使用chomp 删除它们,或使用s/\s+\z// 删除所有尾随空格。

while (<>) {
  chomp;
  print ".$_ ($_)\n";
}

(但添加 \n 以打印您确实想要的换行符。)

【讨论】:

  • 它仍然无法正常工作。这就是我现在看到的,用你的代码:)(一)(二)(三我仍然没有得到.一(一).二(二).三(三)
  • @user1758782 您应该编辑您的帖子以添加您正在尝试的当前代码以及您所看到的内容,以便可以正确格式化。任何多行的东西在 cmets 中都不起作用。
  • @user1758782,很难从您对输出的沟通不畅的描述中分辨出来,但这可能是您试图在 unix 系统上读取带有 Windows 行结尾 (CR LF) 的文件 (其中行以 LF 结尾)。转换文件(例如使用dos2unix),或删除所有尾随空格(s/\s+\z//)而不是仅换行(chomp
【解决方案2】:

除了已经给出的正确答案之外,您还可以在 oneliner 中执行此操作:

perl -pe 's/(.+)/.$1 ($1)/'

或者,如果您更喜欢 while 循环:

while (<>) {
    s/(.+)/.$1 ($1)/;
    print;
}

这只是将您当前的行修改为您想要的输出,然后打印出来。

【讨论】:

  • perl -pe 's/([^\s]+)/.$1 ($1)/' 对他的案子来说似乎更安全。无论如何,对于这样的情况,我确实更喜欢正则表达式。
【解决方案3】:

另一个不使用正则表达式的 Perl 单行代码。

 perl -ple ' $_=".$_ ($_)" ' 

使用给定的输入

$ cat test.txt
one
two
three

$ perl -ple ' $_=".$_ ($_)" ' test.txt
.one (one)
.two (two)
.three (three)

$

【讨论】:

    猜你喜欢
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2015-03-06
    • 1970-01-01
    • 2015-02-11
    • 2013-08-23
    相关资源
    最近更新 更多