32

私は次のような文字列を持っています:

abc.out
def.out

部分文字列を削除するにはどうすればよいですか

。アウト

これらの文字列で?

どのコマンドを使用すればよいですか? (ボーンシェル)

4

6 に答える 6

42

複数の方法、選択:

str=abc.out

シェル:

echo ${str%.*}

Grep:

echo $str | grep -o '^[^\.]*'

sed:

echo $str | sed -E 's/(.*?)\..*/\1/'

Awk:

echo $str | awk -F. '{print $1}'

-F.文字列を。で分割することを意味します。そして$1最初の列を意味します。

切る:

echo $str | cut -d. -f1

すべての出力:

abc
于 2012-11-26T17:55:52.970 に答える
26

これらの文字列がファイルに保存されている場合( と呼びましょうinput_file):

# input_file:

abc.out abc.out abc.out
def.out def.out
def.out

できるよ:

sed -i 's/\.out//g' input_file

これにより、そのファイルから部分文字列がすべて削除.outされます。

説明:

  • sed: sedツールを呼び出して、テキストのストリームを編集します
  • -i: 「インプレース」オプションを使用します。これにより、出力を書き込む代わりに、指定した入力ファイルが変更されます。stdout
  • 's/\.out//g': 正規表現を使用して削除し.outます。最後のgは、すべての出現を削除することを意味します。
  • input_file: 入力ファイルを指定

これらの文字列が変数に格納されている場合:

var1="abc.out"

パラメータ置換を使用できます:

var1=${var1%.out}
echo "$var1"

abc

説明:

  • 上記のリンクから: 「${var%Pattern} $var のバックエンドに一致する $Pattern の最短部分を $var から削除します。」
  • ここで言及されている「パターン」はグロビングと呼ばれ、重要な点で正規表現とは異なることに注意してください。
于 2012-11-26T17:52:04.753 に答える
18

使用したいパターンは変数にある可能性があるため、これが最もうまく機能することがわかりました。

DATA="abc.out"
pattern=".out"
DATA=${DATA/$pattern/}
echo "DATA=${DATA}"

結果は次のとおりです。

abc

于 2017-09-07T20:10:19.080 に答える
4
$ foo=abc.def.out
$ echo ${foo%.out}
abc.def

一般に、最短サフィックスを削除するには、次を使用します。

$ echo ${foo%.*}
abc.def

最長の接尾辞を削除するには、次を使用します

$ echo ${foo%%.*}
abc
于 2012-11-26T17:52:01.380 に答える
1

これらがファイル名の場合は、basename を使用できます。

$ basename a.out .out

あなたに与える:

a
于 2012-11-26T17:57:13.173 に答える