最初の9文字と最後の2文字を削除するために使用hello123456789
するには、これを変換する必要があります。567
sed
コマンドを探していますが見つかりません。機能を実行するために複数の言語を試しましたが、運がありませんでした。
答え1
sed 's/^.........\(.*\)..$/\1/' file
または
sed 's/^.\{9\}\(.*\)..$/\1/' file
または、非標準ですが、一般的に実装されている-E
オプションを使用して拡張正規表現を有効にします。
sed -E 's/^.{9}(.*)..$/\1/' file
これらのすべては、最初の行の先頭の9文字と一致し、次に行の中央(キャプチャ)にある任意の数の文字、最後に最後の2文字と一致します。とにかく、式の中間部分が式の最初のビットと最後のビットを行の先頭と最後に一致させるため、^
and here に$
固定する必要は実際にはありません。行全体は、数値に関係なく中央にキャプチャされた文字に置き換えられます。
別の方法sed
:
sed -e 's/.\{9\}//' -e 's/..$//' file
最初の式は最初の9文字を何もない文字に置き換えて削除し、2番目の式は同様の方法で最後の2文字を削除します。 2番目の式は行の末尾に固定する必要があり$
ますが、最初の式はデフォルトで行の先頭から一致するため、固定する必要はありません。
文字列がシェル変数にある場合は、次の2つの標準var
変数置換を使用して最初に文字列の最初の9文字を削除してから、文字列の最後の2文字を削除します(?
シェルグローブモードで使用した場合はすべての文字と一致します)。
var=${var#?????????}
var=${var%??}
sed
これは、文字列の中央部分をまったく考慮せずに、文字列の先頭と末尾で特定の数の文字を一致させて削除する上記の最後の変形を模倣します。
これをテストしてみてください。
$ var=hello123456789
$ var=${var#?????????}
$ var=${var%??}
$ printf '%s\n' "$var"
567
答え2
Bash パラメーター拡張を使用します。
string=hello123456789
echo ${string:9:-2}
567
答え3
解決策を見逃さないようにするにはawk
:
awk -v s=9 -v e=2 '{ print substr($0, s+1, length()-s-e ) }' infile
バラよりsubstr(文字列、開始位置、長さ)。
答え4
別の(bash
)素晴らしい方法:
str="hello123456789"
[[ "$str" =~ ^.{9}(.*).{2}$ ]]
echo "${BASH_REMATCH[1]}"