有没有更好更干净的方法来使用 AWK 删除字符串

Is there a better and cleaner way to remove strings using AWK

我想知道是否有更好更简洁的方法来仅使用 AWK 删除文件中每一行开头和结尾的字符串?

这是我目前得到的结果

cat results.txt | awk '{gsub("https://", "") ;print}' | tr -d ":443"

File: results.txt

https://www.google.com:443
https://www.tiktok.com:443
https://www.instagram.com:443


To get the result

www.google.com
www.tiktok.com
www.instagram.com

如果是这样的 URL 列表,您可以利用 awk 中的字段分隔符可以是正则表达式这一事实:

awk -F':(//)?' '{print }'

这表示您的字段分隔符是“: 后跟 //”,这会将每一行拆分为:

[] http
[] www.google.com
[] 443

然后我们只打印字段

使用 GNU awk。

使用/:作为字段分隔符并打印第四列:

awk -F '[/:]' '{print }' results.txt

或使用 https://: 作为字段分隔符并打印第二列:

awk -F 'https://|:' '{print }' results.txt

输出:

www.google.com
www.tiktok.com
www.instagram.com
cat results.txt | awk '{gsub("https://", "") ;print}' | tr -d ":443"

我认为你误解了 tr -d 的作用,它用于删除枚举字符(不是子字符串),它 似乎 做你想做的,因为你的测试输入

https://www.google.com:443
https://www.tiktok.com:443
https://www.instagram.com:443

不包含:43应保留,如果需要测试用例会显示故障尝试

https://www.normandy1944.info:443

还有上面的代码 anti-pattern 被称为 cat 的无用使用 因为 GNU AWK 可以自行处理文件

cat results.txt | awk '{gsub("https://", "") ;print}'

可以更简洁地写成

awk '{gsub("https://", "") ;print}' results.txt

我会将您的整个代码 (cat,awk,tr) 重写为单个 awk,如下所示

awk '{gsub("^https://|:443$","");print}' results.txt

说明:将行首 (^) 之后的 https:// 或行尾 ($) 之前的 (|) :443 替换为空字符串(即删除这些部分)然后 print。请注意 ^$ 将阻止删除字符串中间的 https://:443,但如果您可以随意删除 ^$发现这些不太可能。