我需要 cat 一个文件并编辑一个包含多个域名的单行。删除任何具有 4 个字母的特定模式的域名,例如:ozar。
这将在 bash 脚本 中使用,因此域名的数量可以变化,稍后我会将其保存到 csv,但现在返回一个字符串就可以了。
我尝试了多个命令、循环和 if 语句,但将输出发送到我可以在脚本中进一步使用的变量证明是另一项艰巨的任务。
示例文件
$回显文件.txt
ozarkzshared.com win.ad.win.edu win_fl.ozarkzsp.com ap.allk.org allk.org >ozarkz.com website.com
我尝试的(接近)
domains_1=$(cat/tmp/file.txt | sed 's/ozar*//g')
domains_2=$( cat/tmp/file.txt | printf '%s' "${string##*ozar}")
目标
回显域_x
win.ad.win.edu ap.allk.org allk.org website.com
最佳答案
如果所有的域都在一行中,用空格分隔,这可能有效:
awk '/ozar/ {next} 1' RS=" " file.txt
这会设置 RS
,您的记录分隔符,然后跳过与关键字匹配的任何记录。如果您希望能够跳过 shell 变量中提供的子字符串,您可以这样做:
$ s=ozar
$ awk -v re="$s" '$0 ~ re {next} 1' RS=" " file.txt
请注意,~
运算符比较的是正则表达式,而不是精确的子字符串。如果你真的想检查一个子字符串,你可以利用 index()
函数:
$ awk -v s="$s" 'index($0,s) {next} 1' RS=" " file.txt
请注意,以上所有内容都是 awk
,这不是您所要求的。如果您想单独使用 bash 执行此操作,以下内容可能适合您:
while read -r -a a; do
for i in "${a[@]}"; do
[[ "$i" = *"$s"* ]] || echo "$i"
done
done < file.txt
这会将每一行输入分配给数组 $a[]
,然后通过该数组测试子字符串匹配并在没有匹配时打印。 bash 中的文本处理效率远低于 awk 或 sed 等更专业的工具。 YMMV.
关于regex - 从遵循 bash 脚本模式的单行中删除主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58984002/