sed
文字列の末尾から11個の数字を削除するプログラムを作成しようとしています。これは私のコードです...
fname="1a.out12345678901"
fname=$(echo "$fname"|sed 's/[0-9]{11}//')
しかし、これは次のように文字列の末尾からどのように削除しますか?fname
にのみ設定されます。1a.out12345678901
sed
12345678901
答え1
Bashは外部プロセスを呼び出すことなく操作を実行できます。
11桁の数字で終わると、fname
その数字は削除されます。
[[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}
メモ:
この方法では、サブシェルや外部プロセスを作成する必要がないため、より高速です。この操作がループで行われる場合は、速度が重要になる可能性があります。
$(...)
望ましくない副作用のあるコマンドの置き換え。たとえば、シェルはコマンド置換から末尾の改行文字を削除します。このアプローチは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
何:
- 文字列の末尾にアンカーを使用しないため、
$
他の場所から文字が削除されることがあります。 {
これは、EREモードでの使用がサポートされている場合にのみ構文上の意味があります。それ以外の場合は、次のようにする必要sed -r
があります。\{
\}
[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文字を切り捨てることを意味します。