【问题标题】:How to insert text in a line that may have a special character with sed?如何使用 sed 在可能具有特殊字符的行中插入文本?
【发布时间】:2017-09-20 08:21:57
【问题描述】:

我在这里阅读了一些关于它的问答,但对我没有任何帮助。我知道特殊字符在使用sed 时会出现问题,但是如何在不知道它们是否存在于模式中的情况下处理它?

在我的具体情况下,我有一个文件 (file.txt),如下所示:

my line 1.
my line two.
...
this is [ -f another line ]

我正在尝试在随机行的末尾插入一个文本 (my{Text})。

MAX=$(wc -l < file.txt)
Q1=$(expr $MAX / 4)
Q3=$(( 3 * $MAX / 4 ))
LINENUMBER=$(shuf -i $Q1-$Q3 -n1)
LINE="$(head -n $LINENUMBER file.txt | tail -1)"
sed -i -e "${LINENUMBER}s~$LINE~$LINE my{Text}~g" file.txt

$LINE 不是包含this is [ -f another line ] 的行时,此代码运行良好。在这种情况下,$LINE my{Text} 不会替换 $LINE

那么如何处理可能需要使用sed 转义的随机模式?

我正在使用 GNU bash 4.3.11(1) 和 sed (GNU sed) 4.2.2。

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    由于您是在行尾添加文本,因此您无需将现有行的内容放入sed 表达式中。所以,你可以把你的命令写成:

    sed -i -e "${LINENUMBER}s~$~ my{Text}~" file.txt
    

    不管被附加的行是否有任何特殊字符,它都可以工作。

    整个代码可以更高效地编写为:

    max=$(wc -l < file.txt)
    q1=$(( max / 4 ))
    q3=$(( 3 * max / 4 ))
    line=$(shuf -i $q1-$q3 -n1)
    sed -i -e "${line}s~$~ my{Text}~" file.txt
    

    另请参阅:Bash tool to get nth line from a file

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 2017-05-05
      • 1970-01-01
      • 2022-10-23
      • 2012-09-09
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多