【问题标题】:Error finding matches and creating new lines in a text file using sed使用 sed 在文本文件中查找匹配项和创建新行时出错
【发布时间】:2022-01-27 05:51:04
【问题描述】:

我在一个文件中有这个文本

random text 1.- random text 2. random text 3.- random 22 text 4. random text

我想在每个数字前创建一个新行,后跟一个点。这是我的代码:

for number in {1..4}
do
var=$(sed -n "s/.*\([^0-9]$number\.[^0-9]\).*/\1/p" file)
echo $var
sed -i "s/$var/\n$var/g" file 
done

这是我得到的结果:

random text
 1.- random text
 2. random text
 3.- random
 2. text
 4. random text

如果没有点,我不明白为什么它会在数字 22 之前创建一个新行。预期的结果是这样的:

random text
1.- random text
2. random text
3.- random 22 text
4. random text

有人可以帮助我并解释我的错误在哪里吗?非常感谢

【问题讨论】:

  • 我的说法有误,我想说“之前”。文字现已更正。

标签: bash sed


【解决方案1】:

一次性使用sed

$ sed -i.bak 's/[0-9]*\.[^0-9]*/\n&/g' file
random text
1.- random text
2. random text
3.- random 22 text
4. random text

【讨论】:

    【解决方案2】:

    我会使用单个sed 命令来编写它:

    sed 's/ \([0-9][0-9]*\.\)/\
    \1/g' file
    

    【讨论】:

      【解决方案3】:

      number=2 你得到var=' 2.'

      这将作为/ 2./\n 2./g 输入最后一个sed 命令,其中第一个2. 表示将文字2 与任何其他单个字符(.)匹配,这就是它最终匹配@ 的原因987654329@。然后再让你困惑一点,\n 2. 说要插入文字2.,因此22 被替换为2.

      考虑:

      $ echo '22' | sed 's/2./2./'
      2.
      

      当前代码的一个快速修复方法是使用parameter substitution 添加反斜杠以转义$var 中的.

      for number in {1..4}
      do
          var=$(sed -n "s/.*\([^0-9]$number\.[^0-9]\).*/\1/p" file)
          var="${var/./\\.}"      # replace "." with "\."
          echo $var
          sed -i "s/$var/\n$var/g" file
      done
      
      $ cat file
      random text
       1.- random text
       2. random text
       3.- random 22 text
       4. random text
      

      前导空格是第一个 sed 命令中第一个 [^0-9] 的匹配项,由于它位于括号内,因此它被视为捕获组的一部分,因此包含在 \1 参考中。尝试将左括号向右移动一个字符,例如:

      for number in {1..4}
      do
          # replace this:
          #var=$(sed -n "s/.*\([^0-9]$number\.[^0-9]\).*/\1/p" file)
      
          # with this:
          var=$(sed -n "s/.*[^0-9]\($number\.[^0-9]\).*/\1/p" file)
      
          var="${var/./\\.}"
          echo $var
          sed -i "s/[[:space:]]*$var/\n$var/g" file
      done
      

      注意:我添加了[[:space:]]* 以匹配$var 之前的任何空白;替换 (\n$var) 将有效地从现在将是 line-before $var 的末尾删除所述空白。

      结果:

      $ cat file
      random text
      1.- random text
      2. random text
      3.- random 22 text
      4. random text
      

      【讨论】:

      • 我的说法有误,我想说“之前”。文字现已更正。
      猜你喜欢
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 2012-02-14
      • 2013-09-03
      • 2016-10-08
      • 2020-03-03
      • 2016-11-14
      • 1970-01-01
      相关资源
      最近更新 更多