我有一个包含多个逗号的字符串,字符串替换方法只会更改第一个:
var mystring = "this,is,a,test"
mystring.replace(",","newchar", -1)
Run Code Online (Sandbox Code Playgroud)
结果:"thisnewcharis,a,test"
文档指出默认值替换all,并且"-1"也表示替换all,但是不成功.有什么想法吗?
在bash中执行命令替换的首选方法是什么?
我总是这样做:
echo "Hello, `whoami`."
Run Code Online (Sandbox Code Playgroud)
但最近,我经常看到它写得像这样:
echo "Hello, $(whoami)."
Run Code Online (Sandbox Code Playgroud)
什么是首选语法,为什么?或者他们几乎可以互换?
我倾向于赞成第一个,因为我的文本编辑器似乎知道它是什么,并且适当地进行语法高亮.
我在这里读到,在每种情况下,转义字符的行为都有所不同,但我不清楚哪种行为更可取,或者它只取决于具体情况.
附带问题:在一个脚本中使用两个表单是不好的做法,例如嵌套命令替换时?
#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
Run Code Online (Sandbox Code Playgroud)
这个bash脚本在Ubuntu上给了我错误的替换错误.任何帮助将受到高度赞赏.
我运行几个替换命令作为maven的colorize脚本的核心.其中的sed命令,使用正则表达式,在shell工作发现这里讨论.可以在此处找到当前(不工作)的实现.
当我将该命令的一个变体包含到脚本中时,会发生不同的行为:
变式1:
$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"
Run Code Online (Sandbox Code Playgroud)
适应脚本:
-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \
Run Code Online (Sandbox Code Playgroud)
错误: shell输出的信息与我输入的信息相同$ sed.奇怪!?
变式2:
$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"
Run Code Online (Sandbox Code Playgroud)
适应脚本:
-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \
Run Code Online (Sandbox Code Playgroud)
错误:
sed:-e表达式#7,char 59:`s'命令的RHS上的引用\ 1无效
我正在使用Vim,我想用一个长字符串替换一些占位符文本,该字符串跨越多行,这些行已经写入文件中的其他位置.
是否可以用寄存器的内容替换模式?就像是
:%s/foo/<contents of register A>
Run Code Online (Sandbox Code Playgroud)
否则,是否可以用一系列线代替?就像是
:%s/foo/<content of lines from 10 to 15>
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用来自ENV的替换字符串创建脚本文件,但也希望防止一些转义
export PLACEHOLDER1="myPlaceholder1Value"
export PLACEHOLDER2="myPlaceholder2Value"
sudo /bin/su -c "cat << EOF > /etc/init.d/my-script
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: my-script
# Required-Start: \$remote_fs \$syslog
# Required-Stop: \$remote_fs \$syslog
# Should-Start: \$network \$time
# Should-Stop: \$network \$time
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: blabla
# Description: bla bla desc
#
### END INIT INFO
#
myvariable_1=toto$PLACEHOLDER1
myvariable_2=titi$PLACEHOLDER2
myvariable_final=\"dynamicvar=\${myvariable_1},\${myvariable_2}\"
EOF
"
Run Code Online (Sandbox Code Playgroud)
由于myvariable_final没有被转义并被替换为init脚本依赖项中的一个($ remote_fs,$ syslog,$ network,$ time),因此结果不好.
#!/bin/bash
#
### BEGIN INIT …Run Code Online (Sandbox Code Playgroud) 尝试使用带有该行的bash脚本中的sed更改文本文件中的值,
sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp
Run Code Online (Sandbox Code Playgroud)
这将是一个for循环.不知道为什么它不起作用.有什么建议?
我想做以下事情:
$find="start (.*) end";
$replace="foo \1 bar";
$var = "start middle end";
$var =~ s/$find/$replace/;
Run Code Online (Sandbox Code Playgroud)
我希望$ var包含"foo middle bar",但它不起作用.也不是:
$replace='foo \1 bar';
Run Code Online (Sandbox Code Playgroud)
不知怎的,我错过了关于逃避的事情.
我修复了失踪的's'
我正在尝试从字符串中删除所有换行符.我已经读过如何做到这一点,但似乎我出于某种原因无法这样做.这是我正在做的一步一步:
string1 = "Hello \n World"
string2 = string1.strip('\n')
print string2
Run Code Online (Sandbox Code Playgroud)
我仍然在输出中看到换行符.我也尝试过使用rstrip,但我仍然看到换行符.谁能解释为什么我这样做错了?谢谢.
我一直使用基于接口的git客户端(smartGit),因此对git控制台没有多少经验.
但是,我现在需要在历史记录中替换所有.txt文件中的字符串(因此,不要删除整个文件而只是替换字符串).我找到了以下命令:
git filter-branch --tree-filter 'git ls-files -z "*.php" |xargs -0 perl -p -i -e "s#(PASSWORD1|PASSWORD2|PASSWORD3)#xXxXxXxXxXx#g"' -- --all
Run Code Online (Sandbox Code Playgroud)
我试过这个,不幸的是注意到密码确实发生了变化,所有二进制文件都被破坏了.图像等都会被破坏.
有没有更好的方法来做到这一点,不会破坏我的二进制文件?
谢谢.
编辑:
我搞砸了什么.导致二进制文件损坏的实际代码是:
$ git filter-branch --tree-filter "find . -type f -exec sed -i -e 's/originalpassword/newpassword/g' {} \;"
Run Code Online (Sandbox Code Playgroud)
顶部的代码实际上使用我的密码奇怪地删除了所有文件.
git version-control substitution git-filter-branch git-rewrite-history