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

sed '$' matching start of line instead of end

我正在尝试将“.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 上。

编辑: 根据 Ed 的评论,如果你想删除行最后的回车 returns 只有这样以下内容可能会有所帮助。

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

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