为什么不能使用以下bash代码?
for i in $( echo "emmbbmmaaddsb" | split -t "mm" ) do echo "$i" done
预期产量:
e bb aaddsb
由于您需要换行符,因此您只需使用换行符替换字符串中mm的所有实例即可.在纯粹的原生bash中:
in='emmbbmmaaddsb' sep='mm' printf '%s\n' "${in//$sep/$'\n'}"
如果你想在更长的输入流上做这样的替换,你可能最好使用awk,因为bash的内置字符串操作不能很好地扩展到超过几千字节的内容. BashFAQ #21中给出的gsub_literal shell函数(后端到awk)适用:
# Taken from http://mywiki.wooledge.org/BashFAQ/021 # usage: gsub_literal STR REP # replaces all instances of STR with REP. reads from stdin and writes to stdout. gsub_literal() { # STR cannot be empty [[ $1 ]] || return # string manip needed to escape '\'s,so awk doesn't expand '\n' and such awk -v str="${1//\\/\\\\}" -v rep="${2//\\/\\\\}" ' # get the length of the search string BEGIN { len = length(str); } { # empty the output string out = ""; # continue looping while the search string is in the line while (i = index($0,str)) { # append everything up to the search string,and the replacement string out = out substr($0,1,i-1) rep; # remove everything up to and including the first instance of the # search string from the line $0 = substr($0,i + len); } # append whatever is left out = out $0; print out; } ' }
……在这种情况下,用作:
gsub_literal "mm" $'\n' <your-input-file.txt >your-output-file.txt