在包含扩展名 .txt 的单词前添加目录

在包含扩展名 .txt 的单词前添加目录

我有一个名为 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

相关内容