如何使用 sed、grep 或 bash 从仅包含部分行的模式中删除文件中的行

问题描述 投票:0回答:2

我在 file.txt 中有以下内容:

"prom-oa-eui-slrcloud-plt4.test1.devops.oa.iqvia.com",
"auth-oa-eui-slrcloud-plt4.test1.devops.oa.iqvia.com",
"dex-oa-eui-slrcloud-plt4.test1.devops.oa.iqvia.com",
"dashboard-oa-eui-slrcloud-plt4.test1.devops.oa.iqvia.com",
"argocd-oa-eui-slrcloud-plt4.test1.devops.oa.iqvia.com",
"alert-oa-eui-slrcloud-plt4.test1.devops.oa.iqvia.com",
"tntcloudid.test1.devops.oa.iqvia.com",
"tntcloudid-df.test1.devops.oa.iqvia.com",
"tntcloudid-superset.test1.devops.oa.iqvia.com",
"tntcloudid-orchflow.test1.devops.oa.iqvia.com",
"tntcloudid-dmgr.test1.devops.oa.iqvia.com",
"tntcloudid-ps.test1.devops.oa.iqvia.com",
"vanity-tntcloud.test1.devops.oa.iqvia.com",
"vanity-tntcloud-df.test1.devops.oa.iqvia.com",
"vanity-tntcloud-superset.test1.devops.oa.iqvia.com",
"vanity-tntcloud-orchflow.test1.devops.oa.iqvia.com",
"vanity-tntcloud-dmgr.test1.devops.oa.iqvia.com",
"vanity-tntcloud-ps.test1.devops.oa.iqvia.com",
"tntcloud1id.test1.devops.oa.iqvia.com",
"tntcloud1id-df.test1.devops.oa.iqvia.com",
"tntcloud1id-superset.test1.devops.oa.iqvia.com",
"tntcloud1id-orchflow.test1.devops.oa.iqvia.com",
"tntcloud1id-dmgr.test1.devops.oa.iqvia.com",
"tntcloud1id-ps.test1.devops.oa.iqvia.com",
"vanity-tntcloud1.test1.devops.oa.iqvia.com",
"vanity-tntcloud1-df.test1.devops.oa.iqvia.com",
"vanity-tntcloud1-superset.test1.devops.oa.iqvia.com",
"vanity-tntcloud1-orchflow.test1.devops.oa.iqvia.com",
"vanity-tntcloud1-dmgr.test1.devops.oa.iqvia.com",
"vanity-tntcloud1-ps.test1.devops.oa.iqvia.com",
"tntcloud2id.test1.devops.oa.iqvia.com",
"tntcloud2id-df.test1.devops.oa.iqvia.com",
"tntcloud2id-superset.test1.devops.oa.iqvia.com",
"tntcloud2id-orchflow.test1.devops.oa.iqvia.com",
"tntcloud2id-dmgr.test1.devops.oa.iqvia.com",
"tntcloud2id-ps.test1.devops.oa.iqvia.com",
"vanity-tntcloud2.test1.devops.oa.iqvia.com",
"vanity-tntcloud2-df.test1.devops.oa.iqvia.com",
"vanity-tntcloud2-superset.test1.devops.oa.iqvia.com",
"vanity-tntcloud2-orchflow.test1.devops.oa.iqvia.com",
"vanity-tntcloud2-dmgr.test1.devops.oa.iqvia.com",
"vanity-tntcloud2-ps.test1.devops.oa.iqvia.com"

我想删除所有出现“tntcloudid”和“vanity-tntcloud”的字符串,前提是我在条目中有这些模式。

我试过下面的代码:

sed -e "s/tntcloudid//g; s/vanity-tntcloud//g" file.txt

但是它只删除了“tntcloudid”和“vanity-tntcloud”,而不是从行中删除剩余的字符串,比如“.test1.devops.oa.iqvia.com”,“-df.test1.devops.oa.iqvia。 com”等...

因为我有其他字符串,如 vanity-tntcloud1、vanity-tntcloud2 等......这些字符串受到影响,我不想删除字符串的那些部分,但只删除我的模式(仅限“tntcloudid”和“vanity-tntcloud”)

我尝试了下面的代码,但结果是一样的:

sed -e "s/\<tntcloudid\>//g; s/\<vanity-tntcloud\>//g"

我怎样才能只删除与“tntcloudid”和“vanity-tntcloud”模式匹配的行而不影响内容为“vanity-tntcloud1”的其他字符串...“vanity-tntcloud2”等...?

bash sed grep
2个回答
1
投票

要使用 sed、grep 或 bash 根据模式从文件中删除行,您可以使用多种方法。以下是使用这些工具中的每一个的示例:

使用 sed:

sed -i '/pattern/d' file.txt`

此命令将删除 file.txt 中包含指定模式的任何行。 -i 标志就地编辑文件。

使用带有 -v(反转匹配)选项的 grep 并在重命名之前将输出重定向到临时文件:

grep -v 'pattern' file.txt > temp.txt && mv temp.txt file.txt

此命令将创建一个临时文件 (temp.txt),不包括包含该模式的行。然后,它用修改后的文件替换原始文件。

使用 bash 脚本:

#!/bin/bash
pattern="your_pattern"
output_file="output.txt"

while IFS= read -r line; do
  if [[ ! $line =~ $pattern ]]; then
    echo "$line" >> "$output_file"
  fi
done < "file.txt"

在这个bash脚本中,你需要设置pattern和output_file变量。该脚本读取输入文件 (file.txt) 的每一行并检查它是否与模式不匹配。如果不匹配,它会将行附加到 output_file。

请记住根据您要使用的特定模式调整模式变量。这些示例展示了实现相同结果的不同方法。选择最适合您的要求和系统上可用的工具。


0
投票

删除包含特定字符串的行

grep
是一个更好的工具,例如如果
substrings.txt
包含:

tntvcloudid
vanity-tntcloud

然后:

grep -vf substrings.txt infile.txt

将从

substrings.txt
.

中删除包含字符串的行
© www.soinside.com 2019 - 2024. All rights reserved.