我正在尝试使用sed删除以特定方式格式化的文本文件中列表中的特定项目。我只是举例说明;我有......
ITEMS="$ITEM $ITEM1 $ITEM2 $ITEM3"
我想从列表中删除$ ITEM,这样就会......
ITEMS="$ITEM1 $ITEM2 $ITEM3"
该列表甚至可以仅包含$ ITEM而没有编号的$ ITEM,例如......
ITEMS="$ITEM"
这将成为
ITEMS=""
当然,$ ITEM会被删除。
在执行此查找/删除时,不知道列表中存在多少$ ITEM。所述文本文件包含除此行之外的其他文本,但ITEMS =对于文本文件的行的开头是唯一的,即,这是以ITEMS =开头的唯一行。所以基本上,我想找到以ITEMS =开头的行,并从中删除$ ITEM元素。如何才能最好地使用sed完成?
答案 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'