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.

OPは処理後に同じフォーマット(シングルスペースで区切られた値)を持ちたいので、3つのステップを使用しました。よりシンプルで優れた解決策があるかもしれません。私はこの方法を考えただけで、3 つのステップで置換/フォーマットを行います。:(

于 2013-03-28T19:52:54.477 に答える
-1

あなたにとって「単語」が何であるかに応じて、これはおそらくあなたが望むことをするでしょう:

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