sed / awk / 等 - 在粘贴之前对合并的文本进行排序或选择性粘贴:换行

sed / awk / 等 - 在粘贴之前对合并的文本进行排序或选择性粘贴:换行

我的情况:

在内部平台上,IP 列表显示如下: 8.8.8.8 1.0.0.1 1.1.1.1 192.168.1.1 192.168.0.1

当我复制这些值并将它们粘贴到文本文件中时,它们都会被粘贴,例如:

8.8.8.81.0.0.11.1.1192.168.1.1192.168.0.1

因此实际上所有内容都粘贴在一行中且没有空格。

当列表有时有数千个条目时,每天用 IP 复制 IP 是一场灾难。

我完全不知道如何解决这个问题。我尝试检查元素,但每个 IP 都在其自己的<span>元素中,并且每个跨度都有其自己的 ID 和类,因此无法批量替换为空。

我需要的:每个复制的 IP 都应粘贴在新行上。

我使用的操作系统:Ubuntu。

我的 Shell:ZSH

我愿意接受任何解决方案。

答案1

你在 Ubuntu 客户端上安装了 pdftotext 吗?

如果没有,那么从

sudo apt install poppler-utils

然后将网页打印为 pdf 文件

到 ~/Downloads/X.pdf 等位置

接下来借助较少的

您可以查看保留其物理布局的 PDF 文件的文本转换:

less ~/Downloads/X.pdf

并向下滚动到 IP 地址报告发生的位置。

尝试将列表复制/粘贴到另一个文件。如果这样可以生成无乱码格式,那么您很幸运。

然后可以使用以下方式将其变成自动化:

pdf转文本命令也与 poppler-utils 和一些 grep 和 sed 命令一起安装。

pdftotext -layout X.pdf X.txt
grep "\." X.txt | sed "s/[[:space:]]/\n/g" | grep [0-9].[0-9].[0-9].[0-9]

你应该得到如下结果

8.8.8.8
1.0.0.1
1.1.1.1
192.168.1.1
192.168.0.1
8.8.8.81.0.0.11.1.1192.168.1.1192.168.0.1

我的 X.pdf 文件是此网页的直接打印 PDF。接下来,我运行了上述命令,其中甚至包括您不想看到的运行输出。

如果您需要清理输出,请执行额外的过滤,但这应该会对您有很大帮助。

答案2

但每个 IP 都有自己的元素,每个跨度都有自己的 ID 和类

这表明你的文本在 html 文件中。尝试使用 html 查询程序htmlq.然后您可以轻松提取所需的任何内容。

要获取所有跨度,然后仅过滤掉 IP 地址,应该可以执行以下操作:


htmlq -s '\n'  -f yourfile.html 'span' |
  sed -e 's/^<span[^>]*>//' -e 's/<.*//' ) |
  egrep '([0-9]+\.){3}[0-9]+'

如果您需要唯一的 IP ,您可以添加| sort -u,并且原始文件中的出现顺序无关紧要。

请注意,此命令将捕获任何范围内看起来像 IP 的所有内容。这可能超出您的预期,您可能需要优化 htmlq 查询。由于您没有粘贴任何示例文件内容,我只能要求所有范围。但希望您能找到一个更具体的选择器,只捕获您想要的范围。

相关内容