簡體   English   中英

grep匹配,但如果行以dos ^ M結尾則不打印

[英]grep matching but not printing if line end in dos ^M

我需要在多個文件中搜索PATTERN,如果找到,則顯示文件,行和PATTERN,並在其中附加一些字符。 我的問題是,如果匹配PATTERN的行以^ M(CRLF)結尾,則grep會打印空行。

創建一個這樣的文件,第一行“ a ^ M”,第二行“ a”,第三行空行,第四行“ a”(不跟新行)。

a^M
a

a

在PATTERN之后無需嘗試匹配幾個字符,就可以找到並顯示所有匹配項:

# grep -srnoEiI ".{0,2}a" *
1:a
2:a
4:a

如果我嘗試匹配PATTERN末尾的任何字符,它將打印空行而不是第一行,該行以CRLF結尾:

# grep -srnoEiI ".{0,2}a.{0,2}" *

2:a
4:a

我如何改變它以達到預期效果?

PS,我想修復此grep,但我將接受其他解決方案,例如awk。

編輯:

根據以下答案,我選擇剝離\\ r並強制grep將顏色傳遞給tr:

grep --color=always -srnoEiI ".{0,2}a.{0,2}" * | tr -d '\r'

這是一個更簡單的情況,重現您的問題:

# Output 
echo $'a\r' | grep -o "a"
# No output
echo $'a\r' | grep -o "a."

這是因為^M像常規字符一樣進行匹配,並使您的終端覆蓋其輸出(這純粹是修飾性的)。

您要如何解決此問題取決於您要做什么。

# Show the output in hex format to ensure it's correct
$ echo $'a\r' | grep -o "a." | od -t x1 -c
0000000  61  0d  0a
      a  \r  \n

# Show the output in visually less ambiguous format
$ echo $'a\r' | grep -o "a." | cat -v
a^M

# Strip the carriage return
$ echo $'a\r' | grep -o "a." | tr -d '\r'
a
awk -v pattern="a" '$0 ~ pattern && !/\r$/ {print NR ": " $0}' file

要么

sed -n '/a/{/\r$/!{=;p}}' ~/tmp/srcfile | paste -d: - -

兩者都可以:找到模式,查看行是否未以回車結尾,打印行號和行。 對於sed,行號位於其自己的行上,因此我們必須將兩個連續的行用冒號連接起來。

還有其他幾種方法:

使用dos2unix實用程序將dos樣式的行尾轉換為unix樣式:

dos2unix myfile.txt

使用tr預處理文件以刪除CR字符,然后通過管道傳遞給grep:

$ tr -d '\r' < myfile.txt | grep -srnoEiI ".{0,2}a.{0,2}"
1:a
2:a
4:a
$

注意dos2unix可能需要安裝在所使用的任何操作系統上。 在任何POSIX兼容的OS上都可以使用tr

您可以使用pcregrep

pcregrep -n '.{0,2}a.{0,2}' inputfile

對於您的樣本輸入:

$ printf $'a\r\na\n\na\n' | pcregrep -n '.{0,2}a.{0,2}' 
1:a
2:a
4:a

您可以將awk與自定義字段分隔符一起使用:

awk -F '[[:blank:]\r]' '/.{0,2}a.{0,2}/{print FILENAME, NR, $1}' OFS=':' file

測試:

您的grep命令:

grep -srnoEiI ".{0,2}a.{0,2}" file|cat -vte
file:1:a^M$
file:2:a$
file:4:a$

建議的awk命令:

awk -F '[[:blank:]\r]' '/.{0,2}a.{0,2}/{print FILENAME, NR, $1}' OFS=':' file|cat -vte
file:1:a$
file:2:a$
file:4:a$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM