Bash 使用sed删除列表中的项

Bash 使用sed删除列表中的项,bash,Bash,我试图使用sed删除以特定方式格式化的文本文件列表中的特定项。我将简单地举例说明;我有 ITEMS="$ITEM $ITEM1 $ITEM2 $ITEM3" 我想从列表中删除$ITEM,所以这将成为 ITEMS="$ITEM1 $ITEM2 $ITEM3" 列表甚至可以只包含$ITEM,而不包含编号为$ITEM的,如 ITEMS="$ITEM" 这将成为 ITEMS="" 当然,一旦$ITEM从中删除 执行此查找/删除时,不知道列表中存在多少$ITEM。所述文本文件包含除此行之外的其他文

我试图使用sed删除以特定方式格式化的文本文件列表中的特定项。我将简单地举例说明;我有

ITEMS="$ITEM $ITEM1 $ITEM2 $ITEM3"
我想从列表中删除$ITEM,所以这将成为

ITEMS="$ITEM1 $ITEM2 $ITEM3"
列表甚至可以只包含$ITEM,而不包含编号为$ITEM的,如

ITEMS="$ITEM"
这将成为

ITEMS=""
当然,一旦$ITEM从中删除

执行此查找/删除时,不知道列表中存在多少$ITEM。所述文本文件包含除此行之外的其他文本,但ITEMS=对于文本文件行的开头是唯一的,即,这是唯一以ITEMS=开头的行。基本上,我希望找到以ITEMS=开头的行,并从中删除$ITEM元素。使用sed如何才能最好地实现这一点?

根据“单词”对您的意义,这可能会满足您的需求:

echo 'a list of words' | sed 's/\<list\>//g'
echo'a list of words'| sed's/\//g'

$ITEM
之前和之后的空格真的很烦人。:)

试试这句话:

sed -r 's/"\$ITEM /"/; s/\$ITEM //g; s/ ?\$ITEM"/"/' file
用一些例子进行测试:

kent$ echo 'ITEMS="$ITEM"'|sed -r 's/"\$ITEM /"/; s/\$ITEM //g; s/ ?\$ITEM"/"/'                                                                                  
ITEMS=""
7pLaptop 20:57:44 /home/kent/myCodes/vim/last256
kent$echo 'ITEMS="$ITEM $ITEM1 $ITEM2 $ITEM $ITEM3 $ITEM"'|sed -r 's/"\$ITEM /"/; s/\$ITEM //g; s/ ?\$ITEM"/"/'
ITEMS="$ITEM1 $ITEM2 $ITEM3"
编辑

对于OP的评论,请添加解释

's/"\$ITEM /"/;     #step1 check if the first element is $ITEM, do sub
s/\$ITEM //g;       #step2 handle the middle elements
s/ ?\$ITEM"/"/'     #step3 handle the last element case. also this handles single ("$ITEM") case.

我使用了3个步骤,因为OP希望在处理后具有相同的格式(单个空格分隔的值)。可能有更简单/更好的解决方案,我只是想到了这个方法,用3个步骤进行替换/格式化:(

By
$ITEM
你的字面意思是一个美元符号,后面跟一个单词
ITEM
?还是它是一个Bash变量?还是你有一个固定的字符串,
$ITEM
只是你在这个问题中的非正式符号?
$ITEM
字面上是一个美元符号,后面跟一个单词。在这个ca中它不是一个变量se.包括
$
在内的正则表达式字符需要用前面的\进行相应的解释。然后必须对其进行单引号引用,否则它将不起作用:将
ITEMS=“$ITEM”;echo“$ITEMS”
ITEMS='$ITEM';echo“$ITEMS”进行比较“
不需要单引号。您可以在美元符号前使用反斜杠删除正则表达式功能。很抱歉打扰您。这只是删除了单词“list”,但保留两个空格,对吗?是的。根据您的语义,您必须根据自己的需要进行更改。很可能是
s/\syourword\>\\\124; \是的,它确实对我有用!非常感谢。请查看我上面的后续请求。我非常感谢。如果它是一个大文件,您可能会通过一些简单的操作获得性能提升ke
sed-r'/ITEMS=/!b;s/..'
,这样您就可以跳过无关紧要的行上的替换尝试。(
'/ITEMS=/{s/..;}'
也可以工作,但到末尾的分支b更简单)@肯特,你能用外行的术语解释一下你的命令是如何工作的吗?@Kent谢谢你的精彩解释。答案被接受了!@Kent还有,有没有办法只在以ITEMS=”开头的行中执行此操作?我注意到你的命令有一种“全部替换”,而不管行的开头内容如何。