【发布时间】:2020-04-26 04:47:40
【问题描述】:
我有以下模板文件
# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
#http_access allow localhost
我想使用 sed 在下面的行后面附加一些文本(这是一个要求,我不能使用其他工具)
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
我尝试使用以下命令:
sed "/# INSERT YOUR OWN RULE/aTEXTTOAPPEND" test.txt
结果:
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
TEXTTOAPPEND
#
旧代码使用 perl 来完成这项工作
perl -i -0pe 's/(#( |\t)*\n# INSERT YOUR OWN RULE.*\n#( |\t)*\n)/\1\n'"$REPLACE"'\n/g' /etc/squid/squid.conf
我面临两个问题:
1 - 无法在此附加命令中使用变量
到目前为止我试过了:
$ echo $REPLACE
TEXTTOAPPEND
$ sed "/# INSERT YOUR OWN RULE/a${REPLACE}" test.txt
sed: -e expression #1, char 53: unknown command: `B'
sed "/# INSERT YOUR OWN RULE/a\${REPLACE}" test.txt
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
${REPLACE}
#
2 - 在我想要附加文本的行之后无法匹配哈希字符(当我添加 \n 命令停止匹配时,因此在这种情况下不添加任何内容)
sed "/# INSERT YOUR OWN RULE.*\n#/aTEXTTOAPPEND" test.txt
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
预期输出:
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
TEXTTOAPPEND
有人可以指出我在这里缺少什么吗?对于变量扩展,我认为使用双引号和 ${var} 就可以了。
更新:
我正在使用 git-bash 尝试一切,在真正的 linux 机器上尝试时,下面的命令有效:
echo $REPLACE
ABC
sed "/# INSERT YOUR OWN RULE.*/a${REPLACE}" test.txt
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
ABC
#
现在唯一的问题是 2. 在这种情况下如何使用 \n?
sed "/# INSERT YOUR OWN RULE.*\n#.*/a${REPLACE}" test.txt
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
【问题讨论】:
-
你能分享
file test.txt和/或cat -vTE test.txt的输出吗 -
您在 1) 中的第一个命令有效(至少在 GNU
sed中);我不知道你是如何得到你报告的错误信息的。问题 2) 比较棘手,因为sed逐行处理文件,并且一行(根据定义)不会包含换行符后跟其他字符。 -
@umusuarioqualquer:运行
dos2unix file.txt并尝试运行您的sed命令 -
unknown command: 'B'好吧,我猜这个变量有多行,而不是一行,比如REPLACE=$'something\nB something',对吧? -
大家好,我对问题进行了更新,问题1是通过使用真正的linux机器而不是git-bash解决的,现在唯一剩下的问题是第2点,谢谢大家帮助到现在:)