regex - 从遵循 bash 脚本模式的单行中删除主机名

标签 regex linux bash unix sed

我需要 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/

相关文章:

linux - 给 Linux awk 中的外部变量赋值

python - 无法在 Django 设置文件中获取环境变量

bash - mysql_secure_installation 的答案

bash - 按字面意义将文本写入文件,包括特殊字符

html - 根据 HTML 表格中的条件更改列颜色

c++ - 如何正确结束正则表达式 url 匹配

java - 正则表达式匹配一个精确的单词,它的前面或后面只能有空格等

python - 正则表达式匹配列表中的项目 + 尾随 N 个数字 (Python)

regex - 从 CMake 中的 REGEX REPLACE 中排除包含特定字符串的行

c - 如何检查 Linux 进程及其所有子进程何时退出?