【问题标题】:Replacing / with TAB using sed使用 sed 替换 / 用 TAB
【发布时间】:2019-08-06 15:30:05
【问题描述】:

我需要用制表符替换斜线字符,以便可以使用 awk 提取目录名称。

/path/to/some/USEFUL_INFORMATION/in/some/path

我试过这样做,但它所做的只是在我的输出的 from 处放一个“t”。

sed -e 's/\//\t/g' filename

任何帮助将不胜感激。

【问题讨论】:

  • 这似乎取决于sed 的版本。试试tr '/' '\t' < filename 看看会发生什么。
  • 您无需将/ 替换为TAB 并将其提供给awkawk 可以自己做。
  • 你想想,cut -f5 -d'/' < filename怎么样?
  • 问题是需求和暂定解决方案的混合体。实际需要似乎提取了 USEFUL_INFORMATION 但它并不能说明例如在此之前总是有相同数量的斜线,这改变了问题。用 TAB 替换 / 是暂定解决方案的一部分……还是真正的问题?在后一种情况下,有类似stackoverflow.com/questions/1424126/… 的相关问题。
  • gsed -e 's/\//\t/g' filename 因为 GNU sed 理解 \t。在 Mac 上,使用 brew install 安装。

标签: sed awk


【解决方案1】:

首先,您可以使用另一个字符作为s/// 分隔符。命令

sed 's:ABC:DEF:g'

等价于

sed 's/ABC/DEF/g'

这将使您的命令更具可读性,因为您不必转义斜线。

也就是说,有些seds不支持字符转义,比如\t。例如,在 Mac OS X 中我经常遇到这种情况。我的解决方案是按 Control+V,然后按 tab char:

sed 's:/:<Control+V><TAB character>:g'

我机器中的结果是:

$ pwd
/Users/brandizzi/sandbox/demo/mydemo
$ pwd | sed 's:/:        :g'
    Users   brandizzi   sandbox demo    mydemo

但是,如果您打算将所有路径目录放在 awk 变量 $1$2 等中,只需将斜杠声明为带有 awk -F 标志的字段分隔符:

$ pwd
/Users/brandizzi/sandbox/demo/mydemo
$ pwd | awk -F / '{print $3 " " $5}'
brandizzi demo

【讨论】:

  • 感谢: Mac 提示。
  • 同上。正是我想要的。
【解决方案2】:

试试awk:

awk  '{gsub("/","\t",$0); print;}' filename

【讨论】:

  • 这是在 OS X 上对我有用的唯一答案
【解决方案3】:

使用 sed 将 / 替换为 TAB

sed 's/\//\'$'\t/g' filename.txt

通常,将 \'$' 放在制表符 (\t) 和换行符 (\n) 字符之前。在 bash 中工作。

提取目录名:

就个人而言,我会使用 grok12 的答案。

awk -F'/' '{print $5}' filename.txt

【讨论】:

  • 这应该被标记为正确的(最直接的,只使用sed)答案。我也使用^V^I,但不喜欢维护的脚本文件中的不可见字符,一些编辑器可能会搞砸。
【解决方案4】:

我找到了答案,对我来说,here。我有 MacOSX,所以我使用了 Control+v,然后是 Control+i。

sed -e 's/\/[CTR+V][CTR+I]/g' filename

【讨论】:

  • 你也可以用代替 告诉终端按字面意思解释字符,而不是运行绑定操作之一(例如,Tab 通常会尝试自动完成当前单词,但这可以让您直接插入制表符)
【解决方案5】:

awk -F '/' '{print $5}' your_file

这会打印 USEFUL_INFORMATION

它将字段分隔符定义为/。请注意,由于您的字符串以 / 开头,因此第一个字段为 null,因此您的字段计数将比您想象的多一个。

【讨论】:

    【解决方案6】:

    尝试使用双引号(“”)而不是单引号(''),如下面的命令所示。

    sed -i "s/\//\\t/g" filename

    在处理特殊字符时,通常我们在 sed 中使用双引号(" ")。

    在您的情况下,您没有在 TAB 字符(\t)中转义 \

    【讨论】:

      【解决方案7】:

      另一种选择是在sed 中使用`printf "\t"`

      sh -c 'echo test1 test2 | sed -E "s#(.*) (.*)#\2`printf "\t"`\1#g"'
      

      输出是:

      test2   test1
      

      这里显示它适用于您自己的示例:

      sh -c 'echo /path/to/some/USEFUL_INFORMATION/in/some/path | sed "s#/#`printf "\t"`#g"'
      

      输出:

      path    to  some    USEFUL_INFORMATION  in  some    path
      

      【讨论】:

      【解决方案8】:

      使用 + 作为分隔符 sed -e 's+/+\t+g'

      echo 'path/to/something' | sed -e 's+/+\t+g'
      
      // path     to     something
      

      编辑: 提取文件路径的更简单方法:

      dirname /path/to/file.txt
      #output /path/to
      

      【讨论】:

        【解决方案9】:

        看看dirnamebasename

        $ dirname /path/to/some/USEFUL_INFORMATION/in/some/path
        /path/to/some/USEFUL_INFORMATION/in/some
        
        $ basename /path/to/some/USEFUL_INFORMATION/in/some/path
        path
        

        awk 可以处理任何分隔符,例如/:

        $ echo /path/to/some/USEFUL_INFORMATION/in/some/path | awk -F"/" '{print $5}'
        USEFUL_INFORMATION
        

        【讨论】:

          【解决方案10】:

          首先按照其他人的建议,使用另一个字符作为分隔符。其次,使用$'\t' 在引号之外。以; 作为分隔符的示例:

          $ echo "/path/to/some/USEFUL_INFORMATION/in/some/path" | sed -e 's;/;'$'\t'';g'
          path    to  some    USEFUL_INFORMATION  in  some    path
          

          【讨论】:

          • 什么版本的 sed 在什么 *NIX 平台上运行?
          猜你喜欢
          • 2017-03-19
          • 2016-08-12
          • 2013-05-30
          • 1970-01-01
          • 2022-01-19
          • 2022-01-10
          • 2020-02-02
          • 2011-11-25
          • 2012-09-21
          相关资源
          最近更新 更多