【问题标题】:Delete the extra space after special character in all the lines of text file删除文本文件所有行中特殊字符后的多余空格
【发布时间】:2015-08-23 03:42:36
【问题描述】:

以下数据代表2行文本文件:

1 2340: 2 1930: 1     
1 9: 3 4501: 1 45: 1 5620: 2

我想删除“:”后面的空格。所以上述文本文件的输出应该是

1 2340:2 1930:1 
1 9:3 4501:1 45:1 5620:2

【问题讨论】:

  • 请参阅help page,了解什么是“好”问题。您没有提供任何代码或显示任何努力来解决您自己的问题。 SO 不是代码服务。
  • 这是最基本的sed。你有没有尝试过?
  • 我对任何 awk、sed 等都不太熟悉。在 awk 中,我可以根据字段分隔符“”分隔不同的列。我也可以将“:”作为字段分隔符,但我不知道下一步该做什么。
  • This 可能是正确的方向

标签: bash shell text awk sed


【解决方案1】:
$ awk -F': ' -v OFS=":" '{$1=$1}1' file
1 2340:2 1930:1
1 9:3 4501:1 45:1 5620:2

【讨论】:

  • 空格可以是 \t 字符。例如:如果他有一行“666666:f”,在 : 字符之后但在字符“f”之前有一个制表符,那么上面的 cmd 将不起作用。这假设空格也可以包含制表符(人眼不可见...或使用 echo .... | od -cab)
  • 为什么说空格可以是制表符呢? OP在某处的评论中说过吗?问题中没有提到,也没有在他的示例输入中显示,也没有被接受的答案迎合,所以我认为你错了。
  • 你是对的:)。我以为他是 Unix/Linux 的新手,所以他会知道什么是选项卡以及它的外观。
【解决方案2】:

使用以下内容:如果您想替换“:”字符后跟单个/多个空格(“”或“\t”又名制表符)。

sed -i "s/:[ \t][ \t]*/:/g" filename.txt

或者如果您只想将只有一个可见空格的“:”替换为“:”

sed -i "s/:[ \t]/:/g" filename.txt

PS:

  1. 您还可以在 sed 命令中使用其他字符例如:^ 或 # 等代替 /。
    例如:sed -i "s#koba#loki#g" filename.txt

  2. -i 选项(我在上面使用)将更新文件(即就地更新),而不是在屏幕上抛出 std 输出。在您确定要更新的内容之前,请勿使用 -i。首先备份给定文件有时会有所帮助。

【讨论】:

    【解决方案3】:

    你可以使用:

    $ sed -e s"/: /:/g" file.dat
    1 2340:2 1930:1     
    1 9:3 4501:1 45:1 5620:2
    

    解释:

    sed -e "COMMAND" 将通过 file.dat` 执行命令。

    • s 说 sed 代替
    • /: /:/ 是要替换的链和所需的链,由 / 分隔。
    • 最后,g 告诉 sed 每行执行一次以上。

    正如@Tom 评论的那样,引号是更好的单引号,-e 不是必须的,那么:

    $ sed 's/: */:/g' file.dat
    1 2340:2 1930:1     
    1 9:3 4501:1 45:1 5620:2
    

    编辑 2 正如@josifoski 评论的那样,空格字符后的 * 将允许多个空格,而不仅仅是一个

    您可以在此处阅读一些 sed 文档:

    AWK GSUB

    $ awk '{gsub(/: */,":"); print}' file.dat
    1 2340:2 1930:1     
    1 9:3 4501:1 45:1 5620:2
    

    【讨论】:

    • 不需要-e 并且您的引用是不规则的 - 在整个周围使用引号更为常见(并且推荐)命令。
    • 从来不知道!谢谢!!将其添加到答案中
    • 也 /: */ 将是更好的模式覆盖更多的 1spaces 情况,g 在这种情况下是替换所有出现
    • 在 awk 中有没有办法做到这一点?
    • 如果存在人眼看不到的制表符空格怎么办。不会 sed -i "s/:[ \t][ \t]*/:/g" filename.txt 帮助吗?这假设它将仅用“:”替换“:”或“:”或“:\t”。否则, sed -i "s/:[ \t]/:/g" filename.txt 会这样做。
    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多