Perl - Detect from command line if file has only a

2019-08-09 13:42发布

This was the original question.

Using perl, how can I detect from the command line if a specified file contains only a specified character(s), like '0' for example?

I tried

perl -ne 'print if s/(^0*$)/yes/' filename

But it cannot detect all conditions, for example multiple lines, non-zero lines.

Sample input -

A file containing only zeros -

0000000000000000000000000000000000000000000000000000000000000

output - "yes"

Empty file

output - "no"

File containing zeros but has newline

000000000000000000
000000000000

output - "no"

File containing mixture

0324234-234-324000324200000

output - "no"

3条回答
2楼-- · 2019-08-09 13:48

-0777 causes $/ to be set to undef, causing the whole file to be read when you read a line, so

perl -0777ne'print /^0+$/ ? "yes" : "no"' file

or

perl -0777nE'say /^0+$/ ? "yes" : "no"' file         # 5.10+

Use \z instead of $ if want to make sure there's no trailing newline. (A text file should have a trailing newline.)

查看更多
仙女界的扛把子
3楼-- · 2019-08-09 14:07

To print yes if a file contains at least one 0 character and nothing else, and otherwise no, write

perl -0777 -ne 'print /\A0+\z/ ? "yes" : "no"' myfile
查看更多
我想做一个坏孩纸
4楼-- · 2019-08-09 14:13

I suspect you want a more generic solution than just detecting zeroes, but I haven't got time to write it for you till tomorrow. Anyway, here is what I think you need to do:

1. Slurp your entire file into a single string "s" and get its length (call it "L")
2. Get the first character of the string, using substr(s,0,1)
3. Create a second string that repeats the first character "L" times, using firstchar x L
4. Check the second string is equal to the slurped file
5. Print "No" if not equal else print "Yes"

If your file is big and you don't want to hold two copies in memory, just test character by character using substr(). If you want to ignore newlines and carriage returns, just use "tr" to delete them from "s" before step 2.

查看更多
登录 后发表回答