私はコンピュータと対話するのに初心者ですが、スクリプトを書かないと従うことができないプロジェクトを進めているので、助けが必要です。
私のファイルの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/'
答え2
正規表現の sed ドット表現どんな役割でもしかし、ただ一つ性格。
したがって、正規表現は^.\.xyz
次のことを意味します。行の先頭から始めて一致します。一つ文字、ドット、をxyz
意味することもできますが、^.*\.xyz$
これは一致します。みんな行(そして削除)。スペースを区切り文字として使用する必要があります(ファイル名にスペースが含まれていないと仮定)。[^ ]*\.xyz$
つまり、空白()から始まり、行末の拡張子()まで、空白ではなく" "
()複数の文字()を一致させます。各部分の前に::を使用すると、これら2つの置換を表現できます。*
[^ ]
.xyz
$
-e
sed -e 's/^.*xyzfile/*xyz/' -e 's/ [^ ]*\.xyz$//' myfile.inp
*
右側の交換を脱出する必要はありません。
これは次のように単純化できます。
sed -e 's/xyzfile /*xyz /' -e 's/ [^ ]*\.xyz$//' myfile.inp
ファイル名のスペース
ファイル名にスペースが含まれている場合、行の対応する部分だけを選択する簡単な方法がないため、正規表現はより複雑になります。
2番目と3番目のフィールドに文字が1つしかない場合は、キャプチャ角かっこを使用して再挿入できます\1
。
sed -e 's/xyzfile\( . .\) .*\.xyz$/xyz\1/' myfile.inp
存在する拡大する正規表現構文:
sed -E -e 's/xyzfile( . .) .*\.xyz$/xyz\1/' myfile.inp
または、フィールドに複数の文字(スペースを除く)を含めることができる場合:
sed -E -e 's/xyzfile( [^ ]* [^ ]*) .*\.xyz$/xyz\1/' myfile.inp
xyzfile
行が(no)と等しい場合、失敗する可能性があります。
*xyzffff 0 1 pointedto.xyz
この場合、各交換は独立して適用されます。
sed -E -e 's/xyzfile /xyz /' -e 's/( [^ ]* [^ ]*) .*\.xyz$/\1/' myfile.inp