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


126

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

箱にあるように見える唯一のものはsedです。

私は以下を機能させるようにしています:

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

何か案は?


10
${string:5}動作しない場合は、Bashまたはその構文をサポートする別のシェルを使用していません。どのシェルとバージョンを使用していますか?あなたのシバンはどのように見えますか?私の推測では、sh(などdash)またはおそらくを使用していますzsh
追って通知があるまで一時停止。

回答:


0

これも仕事をします:

echo "$pid"|awk '{print $2}'

27
この質問は、「文字列の最初のN文字をスキップ」の最初のヒットです。あなたは質問に答えませんでした。
jww 2019

これは機能していないようで、機能する場合、その方法を説明できます
Alexander Mills

私のシステムでは動作します。フィールド区切り文字に問題がある可能性がありますawk -F": " '{print $2}'。試してください。それでも、私のお気に入りのソリューションではありません。
mzuther

197

以下はうまくいくはずです:

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

よろしいですbashシェルは、スクリプトを実行していますか?

POSIX準拠でも

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

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


1
2番目のパラメーターで長さを指定することもできます:で${var:5:2}始まり1、戻り12ます。
Max Candocia 2018年

107

を使用して最初のX文字を切り取る簡潔な方法を次に示しcut(1)ます。この例では、5番目の文字で始まる部分文字列をカットして、最初の4文字を削除します。

echo "$pid" | cut -c 5-

2
これが最も簡単な解決策です。
ブランドン

2
技術的にはOPはsedのために尋ねたが、これはgitのと組み合わせて使用する場合、「どのように私は[/ bashのターミナルに]文字列から最初のXの文字を削除することができます」のための最善の解決策があるように私は感じて、それはいいです:git log --pretty=oneline | cut -c 42- | head
marksiemers

1
+1シンプルで便利なソリューション.. http:// <example.com>のURLがあり、プロトコル「http://」をカットする場合、7文字ではなく8文字と指定する必要があります。 、しかしそれは私にとってそれがうまくいった方法です。
Santosh Kumar Arjunan

1
Santosh Kumar Arjunan:例 "echo" $ pid "| cut -c 4-"は実際には最初の4文字をカットせず、4番目の文字から始まる部分文字列を抽出するためです。したがって、実際には最初の3文字がカットされます。したがって、最初の7文字を切り取りたい場合は、8文字目からすべてを抽出し、実際には「cut -c 8-」を実行する必要があります
al-ash

1
@DeanHiller cut -c ${LEN}-。中括弧は、文字列を有効な変数文字と連結するために使用され、変数とは何か、そうでないものを区別します。これに関する詳細が必要な場合は、「bash変数の文字列の連結」を調べて、理由/動作の詳細を確認してください。
JustCarty

46

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

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

1
文字列から最後のX文字を削除したい場合はどうなりますか?
コケシュ

5
@Kokesh:sed -r 's/.{5}$//'代わりに最後の5文字を​​取り除くことができます
Mark Longair

7
中括弧をエスケープすれば-r-EOS XではIIRC)なしでそれを行うことができます(ただし、それがOS Xで機能するかどうかはわかりません)。
追って通知があるまで一時停止。

2
@Dennis:私はちょうど確認- (とオフのまま括弧をエスケープ-r/ -EOS Xで動作します)
ゴードンDavisson

15

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

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

@ dtp70一般的な回答に感謝します。
wolfram77 2016年

10

awk '{print substr($0,42)}'42がドロップする文字数よりも1多いところをパイプで渡します。例えば:

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

8

たぶん、あなたも持っcutているでしょう。その場合:

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

1
問題cutは、空白のシーケンスをtr -s ' '適切に処理しないことです。スペースを「圧縮」するために使用すると、動作が改善されます。
トール

1
それはすべて歌うすべてのダンスツールであることを意味しません。それは簡単で、缶に記載されているように機能し、広く入手可能です。上記の要件に対しては問題なく機能するはずであり、特定の位置から固定文字を切り出すよりも確かに堅牢です。
Shawn Chin

5

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

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

-c入力データの終わりから数えて、開始するバイトオフセットでテールを指示しますが、数値が+符号で始まる場合は、入力データの最初から最後までです。


4

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

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

彼は最初の4文字を削除したいと考えています。これは最初の4文字を取得します。
MM。

2

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

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

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

# Uncomment a line (edit the file in-place):
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

-i後は、sed(あなたが前のファイルを編集するには、あなたのマッチング表現をテストしたい場合は、このスイッチを削除する)の場所にファイルを編集することです。

(私はこれを投稿しました。なぜなら、この質問が尋ねられ、以前の回答でその問題が解決されなかったため、sedで完全に実行したかったからです。)


1

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

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

これはより堅牢なソリューションであり、より直感的に思えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.