
私はそれを読み、sed
それがgrep
命令から発展したことを発見しました。
~によるとhttps://en.wikipedia.org/wiki/Sed、
Unixバージョン7で最初に登場したsedは、データファイルのコマンドライン処理用に作成された最初のUnixコマンドの1つです。広く使用されているgrepコマンドの自然な後続バージョン。元の動機は grep(g/re/p) に似ているので、 "g/re/s" です。
sed 検索と置換
sed 's/old/new/' Example.txt
grep
それで、同じことをすることが可能かどうか疑問に思いますsed
。
grep
可能であれば、viaではなくviaを介して同じことを行う方法を教えてくださいsed
。
答え1
grep
パターンに一致する行のみ(そして最初にのみ)印刷するために使用されます。これが意味するものです(コマンドgrep
に従って)。g/re/p
ed
いくつかのgrep
実装では、他のコマンドの機能をわずかに侵害する機能を追加します。たとえば、一部にはタスクの一部を実行するための-r
// 一部があります。--include
--exclude
find
GNUは、一致する行を編集するときに操作の一部を実行するオプションをgrep
追加しました。-o
sed
pcregrep
キャプチャグループが一致するものを印刷するには-o1
、...に展開します。-o2
したがって、その実装を使用すると、これを行うように設計されていなくても、実際に次のものを置き換えることができます。
sed 's/old/new/'
そして:
pcregrep --om-separator=new -o1 -o2 '(.*?)old(.*)'
ただし、キャプチャグループが空の文字列と一致すると正しく機能しません。次のように入力すると:
XoldY
Xold
oldY
それは以下を提供します:
XnewY
X
Y
この問題を解決するには、次のようなより嫌なトリックを使用できます。
PCREGREP_COLOR= pcregrep --color=always '.*old.*' |
pcregrep --om-separator=new -o1 -o2 '^..(.+?)old(.+)..' |
pcregrep -o1 '.(.*).'
つまり、\e[m
一致するすべての行に(着色エスケープシーケンス)を追加して、の両側に1つ以上の文字があることを確認してからold
削除します。
答え2
いいえ、grepは1回の呼び出しで置換を実行できません。これがsed(後でより良いテキスト処理言語であるawk)が必要な理由です。