使用Sed进行字符串更改

时间:2018-01-21 10:28:09

标签: bash sed posix

执行public static void saveToDatabase(Boolean fb, Boolean tw, Boolean pin, String shareUrl, String shareType) { setShareImageFirebaseReference(); String nodeID = dateTimeStampMilliSeconds(); myRef.child(nodeID).child(shareType).setValue(shareUrl); myRef.child(nodeID).child(FACEBOOK).setValue(fb); myRef.child(nodeID).child(TWITTER).setValue(tw); myRef.child(nodeID).child(PINTEREST).setValue(pin); myRef.child(nodeID).child(MY_PHOTO).setValue(thisAppUser.getPhotoUrl()); } 后,我得到输出为

| xxd -bi

现在我正在尝试删除初始0000000,我使用sed做了,我试图删除使用sed存储在00000000: 01101000 01100101 01101100 01101100 01101111 00001010 hello.中的“hello”(变量文本),但我无法实现,请在下面的示例中显示更改。

我尝试过使用cut,但不能改变0000000和最后一个变量字。

$covertthis

4 个答案:

答案 0 :(得分:3)

您只需要一个sed。使用;

分隔命令
# read convert_this
echo "00000000: 01101000 01100101 01101100 01101100 01101111 00001010  hello." | 
sed -E "s/^[^[:blank:]]*[[:blank:]]+//;s/[[:blank:]]+$convert_this\.$//" 

应该这样做。

<强>输出

01101000 01100101 01101100 01101100 01101111 00001010

<强>解释

  • 使用-E的{​​{1}}选项可以使用扩展正则表达式。
  • sed开头的s/^[^[:blank:]]*[[:blank:]]+//;会查找该行的开头。 ^中的[]适用于范围。如果范围以sed开头,则表示您正在否定范围。 ^外观适用于零或更多,*适用于一个或多个。 +是一个匹配任何空白字符的字符类,如空白标签等。简而言之,我们在开头寻找任何非空白字符,后跟一个或多个空格。然后我们替换它没有任何有效删除它。
  • 第二个替代品会替换[:blank:]中存储的字符串以及后面没有任何内容的任何句号。

所有好: - )

旁注:您需要使用双引号来包装sed命令,以便扩展bash变量。功能

答案 1 :(得分:2)

关注awk也可以帮助您。

awk -v val="hello." '{sub(/^0+: +/,"");sub(val,"")} 1'   Input_file

或者,如果您有一个我们希望传递给awk命令的shell变量,那么以下内容也可以帮助您:

convertthis="hello."
awk -v val="$convertthis" '{sub(/^0+: +/,"");sub(val,"")} 1'   Input_file

输出如下。

01101000 01100101 01101100 01101100 01101111 00001010

答案 2 :(得分:1)

使用

sed -i -e "s/$convertthis.$//" bin-store 

而不是

$(sed -i -e 's/($convertthis).//g' bin-store)

使用convertthis变量的内容而不是其文字名称

答案 3 :(得分:0)

尝试此命令:

sed "s/\(^[0-9a-z]\{8\}:[[:space:]]\)\([^a-z]*\)\([a-z]*\)/\2/"

正则表达式将输入分为三组匹配;使用转义括号\(\)描述组。小组如下:

  1. 第一组是字母数字和8个字符,前面是冒号和空格。我们有^匹配开头然后和8个字母数字字符匹配[0-9a-z] \ {8 \}:在这个表达式中,方括号括起一个字符类(字母数字)。空间可以通过[[:space:]]匹配。

  2. 第二组不包含我们匹配的字母字符[^ a-z] *,其中^以方括号反转匹配。

  3. 第三组匹配最后的字母字符。

  4. 然后我们可以用三个组中的任何一个替换字符串:group 2(\ 2)就是我们想要的那个。

    这对于多行输入也同样有效,因为sed逐行匹配。

    附注:对于匹配空格的POSIX,[[:space:]]应该使用 not \ s(参见this question)。