小さな産業用ボックスに組み込まれたLinux用のシェルスクリプトを書いています。テキストpid: 1234
を含む変数があり、行から最初のX文字を削除したいので、1234だけが残ります。 「きれいにする」必要がある変数がもっとあるので、最初のX文字を削除する必要があり、システムで何らかの理由で${string:5}
が機能しません。
ボックスにあると思われる唯一のものはsed
です。
私は次のものを機能させようとしています:
result=$(echo "$pid" | sed 's/^.\{4\}//g')
何か案は?
これも仕事をします:
echo "$pid"|awk '{print $2}'
以下が機能するはずです。
var="pid: 1234"
var=${var:5}
bash
がスクリプトを実行しているのは確かですか?
POSIX準拠でも
var=${var#?????}
外部プロセスを使用するよりも望ましいのですが、これには固定長パターンの形式で5をハードコーディングする必要があります。
cut(1)
を使用して最初のX文字を切り取る簡潔な方法を次に示します。この例では、最初の4文字を削除します。
echo "$pid" | cut -c 4-
-r
構文を使用するには、sed
に{n}
オプション(「スクリプトで拡張正規表現を使用」)を使用します。
$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
文字列から最初の2文字を切り取ります:
$ string="1234567890"; echo "${string:2}"
34567890
おそらく、 cut
もあります。その場合:
[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234
それをawk '{print substr($0,42)}'
にパイプします。ここで、42はドロップする文字数よりも1つ多くなっています。例えば:
$ echo abcde| awk '{print substr($0,2)}'
bcde
$
別の方法として、cut
の代わりにsed
を使用します。
result=`echo $pid | cut -c 5-`
最初からn文字を削除するのではなく、単に数字を直接抽出することもできます。そのようです...
$ echo "pid: 1234" | grep -Po "\d+"
これは、より堅牢なソリューションである可能性があり、より直感的です。
さて、ここでsed
、awk
、cut
およびbash
構文を使用した解決策があります。私は別のPOSIX準拠バリアントを投入したいだけです。
$ echo "pid: 1234" | tail -c +6
1234
-c
は、入力データの末尾からカウントして開始するバイトオフセットを末尾に通知しますが、番号が+
記号で始まる場合、入力データの先頭から末尾までです。
この質問 (確かに、この質問が投稿された後に投稿された)によって提供される純粋な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で完全にやりたいと思ったので、以前の回答ではその問題を解決しませんでした。)