![Unix 从文件中搜索并删除变量(包含斜杠)](https://linux22.com/image/117127/Unix%20%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E6%90%9C%E7%B4%A2%E5%B9%B6%E5%88%A0%E9%99%A4%E5%8F%98%E9%87%8F%EF%BC%88%E5%8C%85%E5%90%AB%E6%96%9C%E6%9D%A0%EF%BC%89.png)
我需要搜索变量“nt”(包含斜杠)。从文件 text1 中删除包含它的所有行
$ echo $nt
/u01/app/us1fa01_0/
$ cat text1
/u01/app/fa01/
/u01/app/us1fa01_0/
/u01/app/us1fa01_ps6/
预期产出-
$ cat text1
/u01/app/fa01/
/u01/app/us1fa01_ps6/
我尝试了以下命令:
sed "/$nt/d" text1
sed: -e expression #1, char 3: unknown command: `u'
sed "|$nt|d" text1
sed: -e expression #1, char 1: unknown command: `|'
sed '\|"$nt"|d' text1
/u01/app/fa01/ /u01/app/us1fa01_0/ /u01/app/us1fa01_ps6/
上述代码似乎都不起作用。寻找出路
答案1
和grep:
grep -Fv -f <(echo "$nt") text1
-F
- 将模式解释为固定字符串列表-v
- 反转匹配的意义,以选择不匹配的行-f
- 从文件中获取模式,每行一个
输出:
/u01/app/fa01/
/u01/app/us1fa01_ps6/
答案2
使用 GNU sed(不确定其他 sed 实现),您可以使用\%pattern%
, 其中%
是任意字符。
所以以下应该有效:
sed "\%$nt%d" text1
答案3
$ sed "\#$nt#d" text1
/u01/app/fa01/
/u01/app/us1fa01_ps6/
sed
如果您用 引用它,则允许您使用任意模式分隔符\
。
这会失败如果$nt
包含任何#
字符。在这种情况下,请使用另一个分隔符。
请注意,这将删除该行中任何位置包含该模式的行。
要强制模式匹配整行,请使用
$ sed "\#^$nt\$#d" text1
$
在这里,我们需要用引用 shell 中的行尾锚点\$
。