linux - 如果文件具有 Windows 行结尾,请将其更改为 Linux 行结尾,否则不执行任何操作

标签 linux file line line-endings

我想写一个 if 语句,如果文件有 Windows 行结尾,则将其更改为 Linux 行结尾,否则什么也不做

这是带有 Windows 行结尾的文件 ^M\r\n

$ cat -v  file.csv | head
"Rec_Open_Date","MSISDN","IMEI","Data_Volume_Bytes","Device_Manufacturer","Device_Model","Product_Description"^M
"2015-10-06","427","060","137765","Samsung Korea","Samsung SM-G900I","$39 Plan"^M
"2015-10-06","592","620","0","Apple Inc","Apple iPhone 6 (A1586)","PREPAY  STD - TRIAL - #16"^M
"2015-10-06","007","290","0","Apple Inc","Apple iPhone 6 (A1586)","PREPAY PLUS - $0 -"^M
"2015-10-06","592","050","48836832","Apple Inc","Apple iPhone 5S (A1530)","Talk and Text Connect Flexi Plan"^M
"2015-10-06","409","720","113755347","Samsung Korea","Samsung SM-G360G","$29 CARRYOVER PLAN"^M
"2015-10-06","742","620","19840943","Apple Inc","Apple iPhone S (A1530)","PREPAY STD - $0 - #2"^M
"2015-10-06","387","180","0","HUAWEI Technologies Co Ltd","HUAWEI HUAWEI G526-L11","PREPAY STD - $1 - #4"^M
"2015-10-06","731","570","2258243","Samsung Korea","Samsung SM-N910U","Business Freedom"^M
"2015-10-06","556","910","13332272","Samsung Korea","Samsung GT-I9505","$49 Plan"^M

这是将其转换为 linux 行结尾的代码 \n :

  $ awk 'sub("\r$", "")' file.csv | head | cat -v
    "Rec_Open_Date","MSISDN","IMEI","Data_Volume_Bytes","Device_Manufacturer","Device_Model","Product_Description"
    "2015-10-06","427","060","137765","Samsung Korea","Samsung SM-G900I","$39 Plan"
    "2015-10-06","592","620","0","Apple Inc","Apple iPhone 6 (A1586)","PREPAY  STD - TRIAL - #16"
    "2015-10-06","007","290","0","Apple Inc","Apple iPhone 6 (A1586)","PREPAY PLUS - $0 -"
    "2015-10-06","592","050","48836832","Apple Inc","Apple iPhone 5S (A1530)","Talk and Text Connect Flexi Plan"
    "2015-10-06","409","720","113755347","Samsung Korea","Samsung SM-G360G","$29 CARRYOVER PLAN"
    "2015-10-06","742","620","19840943","Apple Inc","Apple iPhone S (A1530)","PREPAY STD - $0 - #2"
    "2015-10-06","387","180","0","HUAWEI Technologies Co Ltd","HUAWEI HUAWEI G526-L11","PREPAY STD - $1 - #4"
    "2015-10-06","731","570","2258243","Samsung Korea","Samsung SM-N910U","Business Freedom"
    "2015-10-06","556","910","13332272","Samsung Korea","Samsung GT-I9505","$49 Plan"

这是我的基本 if 语句,我只是不确定如何从行结尾得到 true 或 false:有人可以建议我如何做到这一点吗?

if [ $1 -gt 100 ]  ## line ending =^M
then
awk 'sub("\r$", "")' file.csv   ## remove the windows line endings
fi

据我所知, self 注释 Windows 行结尾可以是 ^M , \r\nCRLF 。 linux 行结尾可以是 \n LF .


编辑1

想想this这就是我正在寻找的。

$  eol=$(cat -v  file.csv | head -n1 | grep -o '..$')
$  echo "$eol"
^M
$ if [ "$eol" = "^M" ]; then echo "true"; fi
true
$ if [ "$eol" = "^M" ]; then echo "true"; else echo "false"; fi
true

我会把awk 'sub("\r$", "")' file.csv放在哪里正如我的真实陈述

最佳答案

使用vim将文件格式更改为Unix,例如

vim file.txt <<EOF
:set fileformat=unix
ZZ
EOF

如果文件已经是 Unix 格式,上面的代码将使文件保持不变。

关于linux - 如果文件具有 Windows 行结尾,请将其更改为 Linux 行结尾,否则不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37287280/

相关文章:

c - 你如何在 C 中的 Linux 上进行非阻塞控制台 I/O?

c++ - Linux套接字编程: read data by SIGIO

javascript - 如何迭代 "line-by-line"npm 中的所有行?

正则表达式不匹配行

java - 文件名.println(String);跳过每隔一行

python - 代理服务器解决对自己的请求

java - 为什么 exec ('java -jar file.jar' ) 不能在浏览器上工作但在命令行上工作?

css - 如何使 scss 文件正常工作?

java - 比较在 java 中使用 File.lastmodified

java - 在java中打开和关闭mp3文件