【问题标题】:Remove spaces in file through shell script通过shell脚本删除文件中的空格
【发布时间】:2022-01-12 06:42:08
【问题描述】:

我有一个 psv 文件,其中记录如下:

  Apple    | Banana     | I want to eat banana        | Carrot

如您所见,所有列都包含前导空格和尾随空格 我使用了这个命令:

sed -i -r 's/\s+//g;/^$/d' fileName

删除空格和空行。之后我得到的结果是:

Apple|Banana|Iwanttoeatbanana|Carrot

我的预期结果有点像这样:

Apple|Banana|I want to eat banana|Carrot

请帮助我使用 shell 脚本获得所需的结果。

提前谢谢你!

【问题讨论】:

  • 什么,一个 sed 问题的 Javascript 骗子?希望你们在结束之前开始阅读更多问题。
  • @anubhava 感谢您的反馈(虽然没有 ping,我几乎错过了它);现在更新了一个更好的欺骗。
  • 谢谢,但您可以看到问题有点不同。 1.它正在将一个分隔符更改为另一个分隔符。 2. 它不询问也不处理每行中的前导/尾随空格。
  • 你想对内部间距大的字段做什么?例如apple|I want to eat a banana |。内部空间是否应该压缩到一个空间?

标签: bash shell unix sed


【解决方案1】:

你可以使用这个sed:

sed -E 's/^[[:blank:]]+|[[:blank:]]*(\|)[[:blank:]]*|[[:blank:]]+$/\1/g' file

Apple|Banana|I want to eat banana|Carrot

说明:

  • ^[[:blank:]]+: 开始后匹配 1 个或多个空格
  • |:或者
  • [[:blank:]]*(\|)[[:blank:]]*:在 | 前后匹配 0 个或多个空格,并在组 #1 中捕获 |
  • |:或者
  • [[:blank:]]+$: 在结束前匹配 1 个或多个空格
  • Replacement is a \1` 将捕获的组 #1 的值替换

awk 解决方案:

awk -F '[[:blank:]]*\\|[[:blank:]]*' -v OFS='|' '{
   gsub(/^[[:blank:]]+|[[:blank:]]+$/, ""); $1=$1} 1' file

Apple|Banana|I want to eat banana|Carrot

【讨论】:

  • 您好,谢谢您的回答,它适用于文件中的“n”条记录还是仅适用于 1 条记录?
  • @Sifu:它将适用于输入文件的所有行。请测试并查看。
  • 是的,它奏效了。非常感谢您的帮助。
猜你喜欢
  • 2015-10-23
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多