web-dev-qa-db-ja.com

sedを使用して文字列から最初のX文字を削除するにはどうすればよいですか?

小さな産業用ボックスに組み込まれたLinux用のシェルスクリプトを書いています。テキストpid: 1234を含む変数があり、行から最初のX文字を削除したいので、1234だけが残ります。 「きれいにする」必要がある変数がもっとあるので、最初のX文字を削除する必要があり、システムで何らかの理由で${string:5}が機能しません。

ボックスにあると思われる唯一のものはsedです。

私は次のものを機能させようとしています:

result=$(echo "$pid" | sed 's/^.\{4\}//g')

何か案は?

102
Kokesh

これも仕事をします:

echo "$pid"|awk '{print $2}'
18
Arnaud F.

以下が機能するはずです。

var="pid: 1234"
var=${var:5}

bashがスクリプトを実行しているのは確かですか?

POSIX準拠でも

var=${var#?????}

外部プロセスを使用するよりも望ましいのですが、これには固定長パターンの形式で5をハードコーディングする必要があります。

171
chepner

cut(1)を使用して最初のX文字を切り取る簡潔な方法を次に示します。この例では、最初の4文字を削除します。

echo "$pid" | cut -c 4-
79
Randy the Dev

-r構文を使用するには、sed{n}オプション(「スクリプトで拡張正規表現を使用」)を使用します。

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
44
Mark Longair

文字列から最初の2文字を切り取ります:

$ string="1234567890"; echo "${string:2}"
34567890
8
dtp70

おそらく、 cut もあります。その場合:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234
6
Shawn Chin

それをawk '{print substr($0,42)}'にパイプします。ここで、42はドロップする文字数よりも1つ多くなっています。例えば:

$ echo abcde| awk '{print substr($0,2)}'
bcde
$
4
Ben

別の方法として、cutの代わりにsedを使用します。

result=`echo $pid | cut -c 5-`
3
Evgeny

最初からn文字を削除するのではなく、単に数字を直接抽出することもできます。そのようです...

$ echo "pid: 1234" | grep -Po "\d+"

これは、より堅牢なソリューションである可能性があり、より直感的です。

0
user1751825

さて、ここでsedawkcutおよびbash構文を使用した解決策があります。私は別のPOSIX準拠バリアントを投入したいだけです。

$ echo "pid: 1234" | tail -c +6
1234

-cは、入力データの末尾からカウントして開始するバイトオフセットを末尾に通知しますが、番号が+記号で始まる場合、入力データの先頭から末尾までです。

0
Mecki

この質問 (確かに、この質問が投稿された後に投稿された)によって提供される純粋なsedで答えを見つけました。これは、sedのみで、まさにあなたが要求したことを行います:

result=\`echo "$pid" | sed '/./ { s/pid:\ //g; }'\``

sed '/./のドットは、一致させたいものです。あなたの質問はまさに私がやろうとしていたことですが、私の場合はファイル内の特定の行を一致させてからコメントを外したかったのです。私の場合、それは:

# Uncomment a line:
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

sedの後の-iは、ファイルをその場で編集するためのものです(ファイルを編集する前に一致する式をテストする場合は、このスイッチを削除してください)。

(FTR、私は信用のためではなくこの回答を投稿しましたが、単にこの質問が尋ねたときにsedで完全にやりたいと思ったので、以前の回答ではその問題を解決しませんでした。)

0
treehead