sed'$'匹配行首而不是行尾

时间:2018-06-22 16:31:08

标签: bash awk sed carriage-return

我正在尝试将'.tsv'附加到文件中文本的末尾。

您可以使用sed 's|$|.tsv|' myfile.txt

轻松完成此操作

但是,这不适用于我的文件,并且我试图弄清楚为什么以及如何对其进行修复以使其能够正常工作。

我要编辑的列如下所示:

$ cut -f12 chickspress.tsv | sort -u | head
Adipose_proteins
Adrenal_gland
Cerebellum
Cerebrum
Heart
Hypothalamus
Ovary
Sciatic_nerve
Testis
Tissue

但是当我尝试使用sed时,结果是错误的:

$ cut -f12 chickspress.tsv | sort -u | sed -e 's|$|.tsv|'
.tsvose_proteins
.tsvnal_gland
.tsvbellum
.tsvbrum
.tsvt
.tsvthalamus
.tsvy
.tsvtic_nerve
.tsvis
.tsvue
.tsvey
.tsvr
.tsv
.tsvreas
.tsvoral_muscle
.tsventriculus

.tsv应该位于行的末尾,而不是最前面。

我认为可能存在一些空格错误,所以我尝试了此操作(macOS):

$ cut -f12 chickspress.tsv | sort -u | cat -ve
Adipose_proteins^M$
Adrenal_gland^M$
Cerebellum^M$
Cerebrum^M$
Heart^M$
Hypothalamus^M$
Ovary^M$
Sciatic_nerve^M$
Testis^M$
Tissue^M$
kidney^M$
liver^M$
lung^M$
pancreas^M$
pectoral_muscle^M$
proventriculus^M$

^M看起来不正确,在我的其他文件中也没有,但是我不确定它在这里代表什么或如何解决,还是不确定此sed命令它。

我使用Python的csv.DictWriter在一个脚本中生成了这个文件,该脚本我过去已经使用了很多次,但从未注意到此错误是由其输出引起的。在这种情况下,请在macOS上运行。

1 个答案:

答案 0 :(得分:3)

编辑: 根据Ed的评论,如果您只想删除最后几行的回车符,那么以下操作可能会有所帮助。

awk '{sub(/\r$/,"")} 1' Input_file > temp_file && mv temp_file Input_file

OR

sed -i.bak '#s#\r$##' Input_file

通过执行以下操作删除M个控制字符,然后尝试执行命令。

tr -d '\r' < Input_file > temp_file  && mv temp_file Input_file

或者,如果您的系统中有dos2unix实用程序,则也可以使用该实用程序删除这些字符。

使用awk

awk '{gsub(/\r/,"")} 1' Input_file > temp_file && mv temp_file Input_file

使用sed

sed -i.bak 's#\r##g' Input_file