【问题标题】:if a file has windows line endings change it to linux line endings else do nothing如果文件有 Windows 行结尾,则将其更改为 linux 行结尾,否则什么也不做
【发布时间】:2016-05-17 22:33:06
【问题描述】:

如果文件有 windows 行结尾,我正在寻找编写 if 语句,将其更改为 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 语句,我只是不确定如何从行尾获得真假:谁能告诉我该怎么做?

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

据我所知,为自己做笔记 Windows 行尾可以是^M\r\nCRLF。 linux的行尾可以是\nLF


EDIT1

认为this 是我正在寻找的。​​p>

$  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 作为我的真实陈述

【问题讨论】:

  • 有什么用?如果文件已经有 *nix 行结尾,那么 awk 命令是无操作的。
  • 如果只需要转换行尾,那么请看man dos2unix
  • 而^M、CR(来自CRLF)和“\r”描述的是同一个字符。
  • file 实用程序的某些配置将报告类似于“MS-Windows 文本文件”的内容。使用 file file.csv 检查您的版本。祝你好运。

标签: linux file line line-endings


【解决方案1】:

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

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

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

【讨论】:

  • 我应该提到但是,可以在 bash 脚本中完成
  • @HatteickNZ 上面是为您编写的,用于添加到 bash 脚本中。 EOF 标记是为了让您可以将输入传递给在您的脚本中最终确定的视图。
  • 这不适用于 vi,仅适用于 vim。如果它似乎与 vi 一起工作,那是因为你的 vi 是 vim cylon
  • 谢谢@user9645 - 我已经更新了我的答案以反映答案是基于vim 而不是vi
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多