From 9785199036985f3692847208edcd828df233812d Mon Sep 17 00:00:00 2001 From: Paul Wise Date: Fri, 20 Apr 2018 12:13:21 +0800 Subject: [PATCH] git-sed: discover a separator when the / character is used in arguments Prevents sed from returning an error for arguments containing filenames: $ git sed src/foo.c src/bar.c sed: -e expression #1, char 13: unknown option to `s' --- bin/git-sed | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/bin/git-sed b/bin/git-sed index 76c0b67..9fcba85 100755 --- a/bin/git-sed +++ b/bin/git-sed @@ -66,7 +66,22 @@ actual command: shift done +all="$search$replacement$flags" +case "$all" in + */*) + ascii="$(for((i=32;i<=127;i++)) do printf '%b' "\\$(printf '%03o' "$i")"; done)" + sep="$(printf '%s' "$ascii" | tr -d "$all")" + sep="$(printf %.1s "$sep")" + if [ "X$sep" = "X" ] ; then + echo 'could not find an unused character for sed separator character' + exit 1 + fi + ;; + *) + sep=/ + ;; +esac r=$(xargs -r false < /dev/null > /dev/null 2>&1 && echo r) -command="git grep -lz '$search' | xargs -0$r sed -i 's/$search/$replacement/$flags'" -git grep -lz "$search" | xargs -0"$r" sed -i "s/$search/$replacement/$flags" +command="git grep -lz '$search' | xargs -0$r sed -i 's$sep$search$sep$replacement$sep$flags'" +git grep -lz "$search" | xargs -0"$r" sed -i "s$sep$search$sep$replacement$sep$flags" do_commit