如何在可能具有sed特殊字符的行中插入文本?

时间:2017-09-19 23:29:46

标签: bash sed

我在这里读了一些Q& A,但没有任何对我有用。我理解使用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。

1 个答案:

答案 0 :(得分: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

另请参阅:here