1

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

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

我想从列表中删除 $ITEM 所以这将成为......

ITEMS="$ITEM1 $ITEM2 $ITEM3"

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

ITEMS="$ITEM"

这将成为

ITEMS=""

当然,一旦 $ITEM 被删除。

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

4

2 回答 2

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 希望在处理后具有相同的格式(单个空格分隔值)。可能有更简单/更好的解决方案,我只是想到了这种方式,分三步进行替换/格式化。:(

于 2013-03-28T19:52:54.477 回答
-1

根据您的“单词”是什么,这可能会满足您的要求:

echo 'a list of words' | sed 's/\<list\>//g'
于 2013-03-28T19:46:02.010 回答