$i
ファイル内で正確に一致するパターンを見つけて、C1.txt
sedコマンドを使用して一致する行を削除しようとしています。でも結局問題にぶつかりました。以下で私が見つけた結果と追加の詳細を見つけてください。
C1.txt
# file: /home/mytest/data # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::--- default:user::rwx default:group::r-x default:group:smr:rwx default:group:agm:r-x default:mask::rwx default:other::---
# file: /home/mytest/datasr123 # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::---
変わりやすい
i=/home/mytest/data
パスワード
#!/bin/bash
Input=C1.txt
j=0
while IFS= read -r line;
do
j=$((j+1))
Exists=$(echo $line | grep -iwoP "$i" )
if [[ ! -z "$Exists" ]]; then
sed -i "$j /\b"$i"\b/d" "$Input"
fi
done <"$Input"
予想される結果
C1.txt
# file: /home/mytest/datasr123 # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::---
エラーメッセージ
sed: -e expression #1, char 3: unknown command: `/'
答え1
エラーが発生する理由は、検索文字列に/
マーカー文字と混同される文字が含まれているためです。つまり、sed
次のように要求します。
sed "//home/mytest/datasr123/d"
これにより表示されるエラーが発生します。 IOW、パターンにはマーカーとして使用する文字を含めることはできません。あなたのパターンがそうであることを知っていればいいえ特定の文字が含まれています。その文字をマーカーとして使用できます。たとえば、その文字が検索文字列にないため、;
次のことができます。
sed "\;/home/mytest/datasr123;d"
または、次の点で$i
:
sed "\;$i;d"
住所の指定方法については、sed
下記のマニュアルページを参照してください。Addresses
もちろん、これが役に立つかどうかは、検索文字列に決して現れない文字を知っているかどうかによって異なります。すべての文字をマーカーとして使用できますが、ユーザーが検索文字列を入力した場合、検索文字列が何であるかを保証することはできません。入力が正しい。 select は検索文字列には表示されません。検索文字列に表示されない文字を見つけるには、検索する必要があります。
最も簡単な方法はいいえ完全に動作しますsed
が、grepに依存しています(私の愚かな間違いを修正してくれた@Kusalanandaに感謝します):
grep -v -F -e "$i" -- <file>
パターンと一致しない行のみを表示します(たとえば-v
、-F
正規表現ではない文字列を文字通り解釈するようにgrepに指示します。たとえば、文字通り一致します。*
パターン.
が-e
aで始まり、-
オプションとして解釈されないようにしますgrep
。--
ファイル名aで始まり-
、次に解釈されないgrep
オプションは次のとおりです。いつもgrep
インタラクティブに呼び出すことはほとんど問題ありませんが、このような状況がいつ発生するのかわからないので、スクリプト内で呼び出す方が良いでしょう。grep
ただし、注:質問が編集されており、スキーマの変更は適用されません。すべてこの回答の方法が完了しました。パターンマッチング両方行が入力されるため、すべて削除されます。"$i"
両方とも一致するnot forを見つけるなど、パターンを何らかの形で再解釈する必要があります。代わりに、"${i} "
最初の行は一致しますが、2番目の行は一致しない追加のスペースを見つけるか、"${i}s"
2行目と一致しません。最初の行。また、使用するときは-F
文字クラスを使用できないため、\b
使用されなくなりました。
答え2
原文にはgrep -iwoP
「正確な一致」という概念が反映されていないようですが…
^
検索文字列に正確に一致する行全体を削除するには、行の先頭と末尾に固定する必要があります。$
sed "\|^$i$|d" C1.txt