我有一个名为 acl.txt 的文件
acl test1 dstdomain web.txt
acl test2 dstdom_regex domain.txt
acl test3 dstdomain .facebook.com
http_access deny test1
http_access deny test2
http_access deny test3
这是我找到的结果,在word.txt前添加“/etc/squid”。示例如下:
acl test1 dstdomain "etc/squid/web.txt"
acl test2 dstdom_regex "etc/squid/domain.txt"
acl test3 dstdomain .facebook.com
http_access deny test1
http_access deny test2
http_access deny test3
如果可能的话?
答案1
您可以使用sed
替换运算符s|old|new|
::
$ sed -E 's|\S+\.txt|etc/squid/&|' file
acl test1 dstdomain etc/squid/web.txt
acl test2 dstdom_regex etc/squid/domain.txt
acl test3 dstdomain .facebook.com
http_access deny test1
http_access deny test2
http_access deny test3
将\S+
匹配一个或多个非空白字符,因此\S+\.txt
将匹配任何不包含空格并以 结尾的字符串.txt
。请注意,.
表示“任何字符”,因此要匹配文字.
,我们需要将其转义为\.
。然后,特殊&
符号将被匹配的内容替换,因此etc/squid/&
只需etc/squid/
在每个以 结尾的单词前添加 即可.txt
。
如果要修改原始文件,请使用-i
:
$ sed -i -E 's|\S+\.txt|etc/squid/&|' file
$ cat file
acl test1 dstdomain etc/squid/web.txt
acl test2 dstdom_regex etc/squid/domain.txt
acl test3 dstdomain .facebook.com
http_access deny test1
http_access deny test2
http_access deny test3
答案2
和awk
:
awk '{for (i=1; i<=NF; ++i) {if ($i ~ "\\.txt$") {$i="etc/squid/"$i}}}1' file
for (i=1; i<=NF; ++i)
将循环遍历当前行的所有字段。if ($i ~ "\\.txt$")
将检查当前字段是否.txt
在其末尾包含...如果为真...$i="etc/squid/"$i
将添加etc/squid/
到该文件的前面。- 最后
1
的 表示打印所有行。
以上操作将输出打印到终端,您可以使用以下命令将其重定向到新文件:
awk '{for (i=1; i<=NF; ++i) {if ($i ~ "\\.txt$") {$i="etc/squid/"$i}}}1' file > newfile
要就地修改原始文件,请使用:
gawk -i inplace '{for (i=1; i<=NF; ++i) {if ($i ~ "\\.txt$") {$i="etc/squid/"$i}}}1' file