【问题标题】:Apply bash script with awk-commands to file将带有 awk-commands 的 bash 脚本应用于文件
【发布时间】:2019-11-29 11:09:41
【问题描述】:

我目前正在编写一个 bash 脚本,以自动生成正则表达式列表,以获取清理文件的链接列表。目前我正在使用 find/replace 在 kate 上手动完成所有操作,但将其作为脚本会更舒服。由于我对 bash 脚本还很陌生,所以我向您寻求帮助。

网址示例列表:

0: "/suburl0"
​
1: "/suburl1"
​
2: "/suburl2"
​
3: "/suburl3"
​
4: "/suburl4"

我目前拥有的脚本:

#!/bin/bash
awk '[^\x00-\x7F]+' $1 #there are non-ascii chars in the file, so clean it out
awk 'NF' $1 # remove non-character lines
awk '^[0-900]{0,3}: ' $1 #delete all those number infront of the link
awk '"' $1 # remove those quotation marks
awk '!seen[$0]++' $1 #remove duplicate lines
awk '{print "http://example.com/" $0}' $1 #prepend the full url to the suburl

目标是将所有这些正则表达式应用于文件,因此文件最终被清理

我的猜测是,我没有正确重定向 awk 的输出,但是当我尝试将其通过管道传输到文件时,文件只是空行。

【问题讨论】:

  • 每个awk 调用都会产生一个修改后的输出,但保持输入文件不变。您有多种解决方案:1)将每个awk 调用的输出重定向到一个文件,让下一次调用对该文件进行处理; 2) 将每个awk 的输出通过管道传输到以下awk 调用中,并且不向它们提供文件输入:它们将使用其标准输入,由前一个输出填充。当然第一个仍然必须以文件为输入,而最后一个的输出可以重定向到一个文件; 3) 使用单个 awk 调用来执行所有操作。
  • 请注意,您的大多数awk 命令也不正确。您可能希望在输入文件上一次测试一个命令并测试它们是否产生预期结果
  • 能否在您的问题中发布您的输入和预期输出示例,然后让我们知道,请确保您将示例/代码包装在代码标签中。
  • 您的 awk 脚本并没有按照它们旁边的 cmets 的建议执行。
  • @Aaron 当我单独执行它们时,会发生错误 awk '{print [^\x00-\x7F]+/}' testfile ^ 反斜杠不是最后一个字符 正则表达式的语法应该是正确,因为它在 kate 中工作没有问题 RavinderSingh13 正如我提到的输入是上面文件中的行,例如:0:“/suburl0”1:“/suburl1”输出应该是:example.com/suburl0example.com/suburl1Arkku正如我提到的,我对 shell 脚本相当陌生。在凯特作品中手动执行这些正则表达式

标签: linux bash shell unix awk


【解决方案1】:

您想要的或多或少的翻译,不限于 awk:

cat $1 \
        | tr -cd '[:print:][:space:]' \
        | grep . \
        | sed -r 's/^[0-9]{1,3}: //' \
        | tr -d '"' \
        | sort -u \
        | awk '{print "http://example.com" $0}'

注意sort会改变顺序,我假设顺序无关紧要。

还要注意sed -r 是 GNU。

稍微简化且更便携的版本:

cat $1 \
        | tr -cd '[:graph:]\n' \
        | grep . \
        | tr -d '"' \
        | sort -u \
        | sed 's,^[0-9]*:,http://example.com,'

输出:

http://example.com/suburl0
http://example.com/suburl1
http://example.com/suburl2
http://example.com/suburl3
http://example.com/suburl4

【讨论】:

  • "sed -r is GNU" 我建议使用sed -E 作为替代,它适用于现代GNU sed 和BSD sed,而且它与grep 的标志一致。它不适用于您想要 -r 的旧 GNU sed 版本,它也不是 POSIX 定义的,但是在一些现代系统上,您有更好的机会使用它,而不必知道您正在为哪个 sed 编码
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2019-12-09
  • 2015-10-07
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
相关资源
最近更新 更多