1

渡された引数に基づいて特定の行を削除しようとしています。

私のdata.txtファイルには

Cpu 500 64 6
Monitor 22 42 50
Game 32 64 128

私のdel.shには含まれています

myvar=$1

sed'/$myvar/d' data.txt > temp.txt
mv temp.txt > data.txt

ただし、temp.txtのすべての行をdata.txtに出力するだけです....ただし

sed '/64/d' data.txt > temp.txt

正しいデータ転送を行います (ただし、64 をハードコーディングしたくありません)。引数にある種の構文エラーがあるように感じます。任意の入力をお願いします

4

3 に答える 3

4

これが望ましくない動作であると仮定します。

$ cat file
Cpu 500 64 6
Monitor 22 42 50
Game 32 64 128

$ myvar=6
$ sed "/$myvar/d" file
Monitor 22 42 50

$ myvar=/
$ sed "/$myvar/d" file
sed: -e expression #1, char 3: unknown command: `/'

$ myvar=.
$ sed "/$myvar/d" file
$

代わりにこれを試してください:

$ myvar=6
$ awk -v myvar="$myvar" '{for (i=1; i<=NF;i++) if ($i == myvar) next }1' file
Monitor 22 42 50
Game 32 64 128

$ myvar=/
$ awk -v myvar="$myvar" '{for (i=1; i<=NF;i++) if ($i == myvar) next }1' file
Cpu 500 64 6
Monitor 22 42 50
Game 32 64 128

$ myvar=.
$ awk -v myvar="$myvar" '{for (i=1; i<=NF;i++) if ($i == myvar) next }1' file
Cpu 500 64 6
Monitor 22 42 50
Game 32 64 128

s をエスケープして sed を使用できると思う場合は/、既に存在するバックスラッシュに 2 つ目のバックスラッシュを追加している可能性があるため、使用できません。

$ foo='\/'
$ myvar=${foo//\//\\\/}
$ sed "/$myvar/d" file
sed: -e expression #1, char 5: unknown command: `/'

$ awk -v myvar="$myvar" '{for (i=1; i<=NF;i++) if ($i == myvar) next }1' file
Cpu 500 64 6
Monitor 22 42 50
Game 32 64 128

これは、sed の構文と、検索で RE のみを許可するという制限のために、一般的に sed で実行できるジョブではありません。

于 2013-09-27T12:54:51.920 に答える