Escape the substitution separator in cleaninput().
Improving on the previous fix and commit, no search for an unused substitution separator is actually needed; sed supports escaping of the substitution separator. Revert the $inputSep abstraction in favor of the former, hard-coded "|" character.
This commit is contained in:
18
todo.sh
18
todo.sh
@@ -272,16 +272,10 @@ cleaninput()
|
|||||||
input=`echo $input | tr -d '\r\n'`
|
input=`echo $input | tr -d '\r\n'`
|
||||||
|
|
||||||
if [ "$1" = "for sed" ]; then
|
if [ "$1" = "for sed" ]; then
|
||||||
# This action uses sed and & as the matched string so escape it.
|
# This action uses sed with "|" as the substitution separator, and & as
|
||||||
|
# the matched string; these must be escaped.
|
||||||
# Backslashes must be escaped, too.
|
# Backslashes must be escaped, too.
|
||||||
input=`echo $input | sed -e 's+\\\+\\\\\\\\+g' -e 's/\&/\\\&/g'`
|
input=`echo $input | sed -e 's+\\\+\\\\\\\\+g' -e 's/\&/\\\&/g' -e 's/|/\\\\|/g'`
|
||||||
|
|
||||||
# Find a separator that doesn't occur in $input, sed cannot handle it, and escaping doesn't help.
|
|
||||||
# In the worst case (no separator found), the replacement text after the "|" is lost.
|
|
||||||
for inputSep in '%' '#' '@' ':' '!' '|'
|
|
||||||
do
|
|
||||||
[[ "$input" = *${inputSep}* ]] || break
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -327,7 +321,6 @@ replaceOrPrepend()
|
|||||||
input=$*
|
input=$*
|
||||||
fi
|
fi
|
||||||
cleaninput "for sed"
|
cleaninput "for sed"
|
||||||
sep=${inputSep:-|}
|
|
||||||
|
|
||||||
# Retrieve existing priority and prepended date
|
# Retrieve existing priority and prepended date
|
||||||
priority=$(sed -e "$item!d" -e $item's/^\(([A-Z]) \)\{0,1\}\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{0,1\}.*/\1/' "$TODO_FILE")
|
priority=$(sed -e "$item!d" -e $item's/^\(([A-Z]) \)\{0,1\}\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{0,1\}.*/\1/' "$TODO_FILE")
|
||||||
@@ -342,7 +335,7 @@ replaceOrPrepend()
|
|||||||
# Temporarily remove any existing priority and prepended date, perform the
|
# Temporarily remove any existing priority and prepended date, perform the
|
||||||
# change (replace/prepend) and re-insert the existing priority and prepended
|
# change (replace/prepend) and re-insert the existing priority and prepended
|
||||||
# date again.
|
# date again.
|
||||||
sed -i.bak -e "$item s/^${priority}${prepdate}//" -e "$item s${sep}^.*${sep}${priority}${prepdate}${input}${backref}${sep}" "$TODO_FILE"
|
sed -i.bak -e "$item s/^${priority}${prepdate}//" -e "$item s|^.*|${priority}${prepdate}${input}${backref}|" "$TODO_FILE"
|
||||||
if [ $TODOTXT_VERBOSE -gt 0 ]; then
|
if [ $TODOTXT_VERBOSE -gt 0 ]; then
|
||||||
newtodo=$(sed "$item!d" "$TODO_FILE")
|
newtodo=$(sed "$item!d" "$TODO_FILE")
|
||||||
case "$action" in
|
case "$action" in
|
||||||
@@ -849,9 +842,8 @@ case $action in
|
|||||||
*) appendspace=" ";;
|
*) appendspace=" ";;
|
||||||
esac
|
esac
|
||||||
cleaninput "for sed"
|
cleaninput "for sed"
|
||||||
sep=${inputSep:-|}
|
|
||||||
|
|
||||||
if sed -i.bak $item" s${sep}^.*${sep}&${appendspace}${input}${sep}" "$TODO_FILE"; then
|
if sed -i.bak $item" s|^.*|&${appendspace}${input}|" "$TODO_FILE"; then
|
||||||
if [ $TODOTXT_VERBOSE -gt 0 ]; then
|
if [ $TODOTXT_VERBOSE -gt 0 ]; then
|
||||||
newtodo=$(sed "$item!d" "$TODO_FILE")
|
newtodo=$(sed "$item!d" "$TODO_FILE")
|
||||||
echo "$item $newtodo"
|
echo "$item $newtodo"
|
||||||
|
|||||||
Reference in New Issue
Block a user