我在这里读了一些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。
答案 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