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

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

./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

How do I remove the first dot from each line?

181312 次浏览

你可以通过管道

cut -c2-

也就是说

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


./g.sh < directory_listnitg.txt

不同的方法,使用 sed,它的好处是可以处理不以点开头的输入。而且,如果 echo在输出中附加一个换行符,也不会遇到问题,这会导致 md5sum 报告错误的结果。

#!/bin/bash


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

compare these:

$ echo "a" | md5sum
60b725f10c9c85c70d97880dfe8191b3  -


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

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

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

你可以这样做:

% 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>

我认为它总共只调用一个 subshell。它应该是非常好的,但在我看来,find ... -exec md5sum {} ... +可能是更安全,更快,所有你需要的。

EDIT2:

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

${string#?}

-Mike

myString="${myString:1}"

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

There ia a very easy way to achieve this:

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

$ ROLE_TAG=role
$ INSTANCE_ID=i-123456789

你只需要加上’#’+ [ your _ ) ,例如:

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

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

method 1) using bash

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

method 2) using cut

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

方法3)使用 sed

 str="price: 9832.3"
sed 's/^.\{7\}//' <<< $str

方法4)使用 awk

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

或者像这样

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