【问题标题】:shell duplicate spaces in file文件中的shell重复空格
【发布时间】:2020-03-31 16:25:09
【问题描述】:

是否可以从文本文件中删除多个空格并使用 awk 或 grep 将更改保存在同一文件中?

Input example:
aaa     bbb  ccc
   ddd    yyyy

Output I want:
aaa bbb ccc
ddd yyyy

【问题讨论】:

  • 这能回答你的问题吗? How to remove extra spaces in bash?
  • @nuclearwinter27 : grep 不修改任何文件。它读取文件并写入标准输出。 awk 程序可以创建文件,但我不知道 awk 提供任何就地更新文件的功能;至少它不是为此而设计的。一些语言和工具(例如sedrubyperl)通过模拟“就地”编辑使这项任务变得容易。

标签: linux shell awk grep


【解决方案1】:

只需将 $1 的值重新设置为 $1,这将允许 OFS 出现并在行中添加适当的空格。

awk '{$1=$1} 1' Input_file


编辑:既然 OP 提到如果我们只想保留起始空格,那么请尝试以下操作。

awk '
match($0,/^ +/){
  spaces=substr($0,RSTART,RLENGTH)
}
{
  $1=$1
  $1=spaces $1
  spaces=""
}
1
'  Input_file

【讨论】:

  • 但是如果我有一个文本文件,如何保持行首的对齐方式?
  • @nuclearwinter27,请立即尝试 EDIT 解决方案,然后让我试试?
  • @nuclearwinter27,如果在原地编辑追加`> temp && mv temp Input_file`到我的代码。但请确保您运行我提到的命令(在我的帖子中)以确保终端上一切顺利。
【解决方案2】:

使用sed

sed -i -E  's#[[:space:]]+# #g' < input file 

用于删除开头的空格

sed -i -E  's#[[:space:]]+# #g; s#^ ##g' < input file

演示:

$cat test.txt
aaa     bbb  ccc
   ddd    yyyy

Output I want:
aaa bbb ccc
ddd yyyy
$sed -i -E  's#[[:space:]]+# #g' test.txt 
$cat test.txt
aaa bbb ccc
 ddd yyyy

Output I want:
aaa bbb ccc
ddd yyyy
$

【讨论】:

    猜你喜欢
    • 2019-07-16
    • 2011-01-19
    • 2012-09-29
    • 1970-01-01
    • 2019-04-27
    • 2020-04-13
    • 2016-11-26
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多