sed を使用して各行の 2 番目から最後の文字を削除する

sed を使用して各行の 2 番目から最後の文字を削除する

ファイルの各行の最後の文字の前の文字を削除するには?

sed 's/.$//' myfile1.txt各行の最後の文字を削除しようとしましたが、各行myfile1.txtの最後の文字から2番目の文字を削除する方法がわかりません。

答え1

あなたはできます:

sed -E 's/.(.)$/\1/' file.txt  

バックアップを作成せずにファイルを編集するには:

sed -Ei 's/.(.)$/\1/' file.txt 

ファイルを適切に編集し、.bak拡張子を使用して元のファイルをバックアップするには、次の手順を実行します。

sed -Ei.bak 's/.(.)$/\1/' file.txt 

POSIXスタイル:

sed 's/.\(.\)$/\1/' file.txt

答え2

移植可能なコマンドの完全な説明(誰か尋ねたら)誰でもこれを理解できます:

sed 's/.\(.\)$/\1/' file.txt

まず、「明白な」内容:この行には、コマンド名(sed)とシェルがコマンドに渡した2つの個別の引数が含まれています。一重引用符はシェルによって削除されるため、sed「seen」パラメータは次のようになります。

s/.\(.\)$/\1/

そして

file.txt

ハイフンで始まるパラメータがないため、sedオプションとして解釈されません。

最初の引数は実行する編集コマンドとして解釈され、他のすべての引数(この場合は1つのみ)は編集コマンドで編集するテキストをfile.txt読み取るファイルの名前(最初の引数)として解釈されます。 。

sed(編集したテキストはファイルに書き戻されず、「標準出力」、つまりターミナル、コマンドラインウィンドウに書き戻されます。)

file.txtこのコマンドを実行するときは、シェルの「現在の作業ディレクトリ」ディレクトリにあるファイルのファイル名でなければなりませんsed。 (コマンドが実行されたときにシェルの現在の作業ディレクトリに関係なく、同じファイルでコマンドを実行するには、「絶対パス」を読んでください。)


それでは、編集コマンド自体を分解しましょう。

s/.\(.\)$/\1/

s編集コマンドは、「交換」を意味する文字で始まります。 「s」の後の文字(/この場合)から同じ文字の次のインスタンス(/再)までは、次のようになります。模様交換予定です。つまり、置き換えるテキストが「どのような外観」であるべきかを指定します。sedこれは、置き換えるべき(置き換えるべき)テキストがいつ発見されたかを「知る」方法を伝えます。

この例のパターンは次のとおりです。

.\(.\)$

(実際には「モード」の代わりに正しい用語は正規表現、元は「正規表現」の略です。ここでは、正規表現に関するより広いトピックについて議論しません。 )

正規表現は、.「すべての単一文字」を意味する「ワイルドカード」である点()で始まります。それマッチ(説明、記号)テキストの単一文字。

バックスラッシュ(\)は、シェルコマンドと正規表現の「エスケープ」文字としてよく使用されます。通常、これは次のいずれかを意味します。削除それに続く文字の特別な意味または次へ追加次の文字には特別な意味があります。

この場合、角括弧(および()は次)のようになります。脱出する(つまり、前にバックスラッシュが来る)順に次へ追加特別な意味があります。正規表現でエスケープされた括弧の特別な意味は、sed括弧の間の正規表現部分に一致するすべてのテキストが特に「コメント」されているまた乗り換える到着これについては後でもう一度説明します(この角括弧のグループ化を検討するとき)。

.括弧内のピリオド()は、単一の文字と一致します。

ドル記号($)を呼び出します。アンカー、一致するテキスト行の終わりです。 このアンカーがない場合、正規表現は単に一致します。ランダムな2文字(特に、これは名前付きファイルから読み取られたテキストの各行の最初の2文字と一致しますfile.txtsed

正規表現は次のようなものです。固定行の最後まで、2つの点が一致する必要があります。最後テキストの各行には2つの文字があります(最後の文字は後で参照できるように表示されます)。

(置換)コマンドの次の部分は、次の文字ssこの場合はスラッシュ/)の2番目のインスタンスから次の文字の3番目のインスタンスに移動しますs。これは…交換モード。sed何をすべきかを指定します。変える一致するテキスト検索モード(正規表現).

この場合、置換パターンは次のようになります。

\1

同様にバックスラッシュも使用されます。脱出するこの場合、次の文字は次のようになります。次へ追加特別な意味をなくすのではなく、特別な意味を持つようになるのです。

バックスラッシュの後に数字(1〜9)が付くことを呼び出します。逆参照。 これは何ですか?アナポラ検索パターン内の角かっこ内に一致するテキストをグループ化します。数字なので、1これは次のことを意味します。最初ブラケットのグループ化。 (もちろん、この場合、そのようなグループ化が1つだけ存在します。)

要約すると、この編集コマンドの意味は、エスケープされた角かっこに一致するテキストをエスケープされた角かっこ内の一致するテキスト(つまり、行の最後の文字)に置き換えることです。みんな正規表現検索(これが最後です。二つ行の文字)。

最終的な効果は、各行から最後から2番目の文字を削除することです。

あるいは、より正確には、各行の現在のsed作業ディレクトリにあるfindというファイルからテキストの各行を読み取り、最後のfile.txt行を置き換えます。二つ行の文字と行の単一の最終文字は、変更された各行をその行に印刷します。標準出力。

関連情報