使用sed删除列表中的项目

时间:2013-03-28 19:34:08

标签: bash

我正在尝试使用sed删除以特定方式格式化的文本文件中列表中的特定项目。我只是举例说明;我有......

ITEMS="$ITEM $ITEM1 $ITEM2 $ITEM3"

我想从列表中删除$ ITEM,这样就会......

ITEMS="$ITEM1 $ITEM2 $ITEM3"

该列表甚至可以仅包含$ ITEM而没有编号的$ ITEM,例如......

ITEMS="$ITEM"

这将成为

ITEMS=""

当然,$ ITEM会被删除。

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

2 个答案:

答案 0 :(得分:1)

$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个步骤中进行替换/格式化。 :(

答案 1 :(得分:-1)

根据您的“单词”,这可能会做您想做的事情:

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