sedを使用して文字列から文字を削除する

sedを使用して文字列から文字を削除する

sed文字列の末尾から11個の数字を削除するプログラムを作成しようとしています。これは私のコードです...

fname="1a.out12345678901"

fname=$(echo "$fname"|sed 's/[0-9]{11}//')

しかし、これは次のように文字列の末尾からどのように削除しますか?fnameにのみ設定されます。1a.out12345678901sed12345678901

答え1

Bashは外部プロセスを呼び出すことなく操作を実行できます。

11桁の数字で終わると、fnameその数字は削除されます。

[[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}

メモ:

  1. この方法では、サブシェルや外部プロセスを作成する必要がないため、より高速です。この操作がループで行われる場合は、速度が重要になる可能性があります。

  2. $(...)望ましくない副作用のあるコマンドの置き換え。たとえば、シェルはコマンド置換から末尾の改行文字を削除します。

  3. このアプローチはPOSIXではありません。バッシュが必要です。

はい

以下は、最後の11桁の数字を削除する方法を示しています。

$ fname="1a.out12345678901"; [[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}; echo "fname=$fname"
fname=1a.out

fnameが11桁以上で終わると、最後の11桁のみが削除されます。

$ fname="1a.out012345678901"; [[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}; echo "fname=$fname"
fname=1a.out0

fnameが11桁未満で終わると、数字は削除されません。

$ fname="1a.out1234567890"; [[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}; echo "fname=$fname"
fname=1a.out1234567890

答え2

何:

  1. 文字列の末尾にアンカーを使用しないため、$他の場所から文字が削除されることがあります。
  2. {これは、EREモードでの使用がサポートされている場合にのみ構文上の意味があります。それ以外の場合は、次のようにする必要sed -rがあります。\{\}
  3. [0-9]ロケールに応じて意味があるため、必要な動作を保証するには、期待に合わせてロケールを設定する必要があります(この場合C

総合してみると:

$ echo 1a.out12345678901 | LC_ALL=C sed 's/[0-9]\{11\}$//'
1a.out

答え3

これを行う簡単な方法がいくつかあります。 head、tail、またはcutを使用でき、sedや正規表現は必要ありません。

ヘッダーを使用して:

fname="1a.out12345678901"
fname=$(echo "$fname"|head -c -12)

head -c -N、最後のN-1文字を切り取ります。尾もそのことができます。

カットを使用して:

fname="1a.out12345678901"
fname=$(echo "$fname"|rev |cut -c 12-|rev)

revは文字列を反転させる

cut -c 12- は、12番目の文字から最初の11文字を切り捨てることを意味します。

関連情報