在Bash中删除字符串的第一个字符

时间:2011-07-06 09:17:17

标签: bash

我需要计算ls转储directory_listing_file中每行的一个字符串(路径文件)的md5sum:

./r/g4/f1.JPG
./r/g4/f2.JPG
./r/g4/f3.JPG
./r/g4/f4.JPG

但是应该在没有初始点的情况下计算md5sum。 我写了一个简单的脚本:

while read line
do
    echo $line | exec 'md5sum'
done

./g.sh < directory_listnitg.txt

如何从每行中删除第一个点?

8 个答案:

答案 0 :(得分:43)

myString="${myString:1}"

从myString的字符编号1开始(字符0是最左边的字符)返回字符串的剩余部分。 “s允许字符串中的空格。有关该方面的更多信息,请查看$ IFS。

答案 1 :(得分:19)

您可以将其传送到

cut -c2-

哪个给你

while read line
do
echo $line | cut -c2- | md5sum
done

./g.sh < directory_listnitg.txt

答案 2 :(得分:4)

你可以这样做:

% sh -c `sed 's@^.\(.*\)@md5sum \1@' <./dirlist.txt`

真的,我想你可以提高效率,但我不知道是什么产生你的清单。如果您可以pipe,或者通过heredoc运行该命令以保持其输出正常,那么您可以完成整个流程的工作。

修改

好的,你说这是来自“ls dump”。嗯,这里有点灵活:

% ls_dump() {
> sed 's@^.\(.*\)$@md5sum \1@' <<_EOF_ | sh -s
>> `ls ${@}`
>> _EOF_
> }
% ls_dump -all -args -you /would/normally/give/ls
<desired output>

我认为这总共只调用一个子shell。它应该是相当不错的,但在我看来,find ... -exec md5sum {} ... +可能更安全,更快,而且你所需要的只是。

<强> EDIT2:

好的,现在我将回答这个问题。要删除任何POSIX兼容shell中字符串的第一个字符,您只需要查看参数扩展,如:

${string#?}

-Mike

答案 3 :(得分:3)

使用sed的不同方法,它具有可以处理不以点开头的输入的好处。此外,您不会遇到echo在输出中附加换行符的问题,这会导致md5sum报告虚假结果。

#!/bin/bash

while read line
do
     echo -n $line | sed 's/^.//' | md5sum
done < input

比较这些:

$ echo "a" | md5sum
60b725f10c9c85c70d97880dfe8191b3  -

$ echo -n "a" | md5sum
0cc175b9c0f1b6a831c399e269772661  -

答案 4 :(得分:3)

从行或字符串中删除前n个字符

#method1)使用bash

 str="price: 9832.3"
 echo "${str:7}"

#method2)使用剪切

 str="price: 9832.3"
 cut -c8- <<< $str

#method3)使用sed

 str="price: 9832.3"
 cut -c8- <<< $str

#method4)使用awk

 str="price: 9832.3"
 awk '{gsub(/^.{7}/,"");}1' <<< $str

答案 5 :(得分:2)

将字段分隔符设置为路径分隔符,并将除第一个斜杠之前的内容之外的所有内容读入$name

while IFS=/ read junk name
do
    echo $name
done < directory_listing.txt

答案 6 :(得分:1)

有一个非常简单的方法可以实现这一目标:

假设我们不需要变量中的前缀“ i-”

$ ROLE_TAG=role                                                                            
$ INSTANCE_ID=i-123456789

您只需要添加'#'+ [your_exclusion_pattern],例如:

$ MYHOSTNAME="${ROLE_TAG}-${INSTANCE_ID#i-}"  
$ echo $MYHOSTNAME
role-123456789

答案 7 :(得分:1)

或者这样

myString="${myString/.}"

在Ubuntu 18.04.4 LTS,bash 4.4.20上进行测试:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:    18.04
Codename:   bionic

$ echo $BASH_VERSION
4.4.20(1)-release

$ myString="./r/g4/f1.JPG"
$ myString="${myString/.}"
$ echo $myString
/r/g4/f1.JPG