私はコンピュータと対話するのに初心者ですが、スクリプトを書かないと従うことができないプロジェクトを進めているので、助けが必要です。
私のファイルの1行に2つの文字列があり、sedを使用してそれを置き換えたいと思います。問題は、それらが非常に似ており、独立して交換する方法がわからないということです。
私が変更したい行は次のとおりです。
*xyzfile 0 1 somefilebeingpointedto.xyz
私はこの行で終わりたいです:
*xyz 0 1
ファイル間で0と1が変更され、最後の文字列の ".xyz"の前に保守的な文字列がないため、これを行う方法や単に行全体を置き換える方法がわかりません。
私は次の2行のsedを使用しようとしました。
sed -i 's/^.*xyzfile/\*xyz/' myfile.inp
sed -i 's/^.\.xyz/" "/' myfile.inp
順序は何の違いもありません。 sedはピリオドを2行目の文字列の一部としてまったく考慮しないようです。
これを達成するより良い方法があれば、私は皆耳を傾けます!ありがとう
ベストアンサー1
2番目の例の問題は、行とまったく一致しないことです。一致を試してください^.\.xyz
。つまり、<beginning of line><any character>.xyz
。しかし、あなたが一致させようとしていると思います<some characters>.xyz<end of line>
。これまでは削除し、状況に合わせて定義する^
方法を見つける必要があります。<some characters>
しかし、2回のsed呼び出しは必要ありません。ホールドモードsedから。希望のパターンを囲むと維持する\1
(エスケープされた)括弧を使用すると、後でこれを(または\2
2番目のパターンなど)に置き換えることができます。
file
したがって、最後のファイル名を削除したいと思います。
*xyzfile 0 1 somefilebeingpointedto.xyz
だから私はモード考えるあなたが探しているのは(「file」というテキストを含む)です:
<something to keep>file<something to keep><space><pattern without spaces until end of line>
これを次のように組み合わせることができます。
^\(.*\)file\(.*\) [^ ]*$
保持したい2つの部分は(エスケープされた)括弧内にあります。後で使用するために保存したくない場合は、角かっこ(.*file.* [^ ]*
)を削除できます。
次に、sedを置き換えると、次のような完全な行が得られます。
sed 's/^\(.*\)file\(.*\) [^ ]*$/\1\2/'