【问题标题】:getting first part of a string that has two parts获取包含两部分的字符串的第一部分
【发布时间】:2020-06-06 02:28:51
【问题描述】:

我有一个字符串,它有两个部分(路径和所有者),都用空格分隔。

这是输入文件input.txt

/dir1/dir2/file1 @owner1
/dir1/dir2/foo\ bar @owner2

我想将所有路径提取到一个单独的输出文件 - output.txt 我不能使用空格作为分隔符,因为路径中也可以包含带有空格和分隔符的文件名

/dir1/dir2/file1
/dir1/dir2/foo\ bar

【问题讨论】:

  • 我尝试使用 cut -d" " -f1 但这会让我获得完整路径,因为一些路径也被空格分隔
  • @kushanky,感谢您让我们知道您的努力,请将它们添加到您的问题中,因为 cmets 不是用来编写代码的。请用相同的方式编辑您的帖子。

标签: bash awk sed grep cut


【解决方案1】:

这可能是使用rev + GNU grep 的不同方式:

rev file | grep -oP '.*@ \K.*' | rev

rev file | grep -oP '.*@\s+\K.*' | rev

使用原始的简单解决方案:

awk -F' @' '{print $1}' Input_file

【讨论】:

    【解决方案2】:

    假设不应该被解析为定界符的空格被反斜杠转义,就像您的示例一样,您可以使用以下正则表达式:

    ^(\\ |[^ ])*
    

    例如grep

    grep -oE '^(\\ |[^ ])*'
    

    正则表达式从行首匹配任意数量的反斜杠后跟空格或任何其他字符而不是空格,并且将在第一次出现之前没有反斜杠的空格处停止。

    你可以try it here

    【讨论】:

      【解决方案3】:

      我会用 sed 修剪结尾部分。

      sed 's/ [^ ]*$//' /path/to/file

      这将从行尾开始匹配:

      • (空白)匹配空格字符
      • [^ ]* 匹配最长的不包含空格的字符串,即@owner1
      • $ 匹配行尾

      它们将被任何内容替换,就像您删除了匹配的字符串一样。

      【讨论】:

        【解决方案4】:

        一行就可以了:

        while read p _; do printf '%q\n' "$p"; done <input.txt >output.txt
        

        【讨论】:

          【解决方案5】:

          你可以把它们放在一个数组中并处理

          mapfile test < input.txt; test=("${test[@]% *}")
          echo "${test[@]}"
          echo "${test[0]}"
          echo "${test[1]}"
          

          【讨论】:

            【解决方案6】:

            你可以用简单的 awk 试试

            awk ' { $NF=""; print } ' 
            

            在这里试试https://ideone.com/W8J1ZO

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-08-11
              • 2016-06-13
              • 1970-01-01
              • 1970-01-01
              • 2023-03-16
              相关资源
              最近更新 更多