|
From: | GNU bug Tracking System |
Subject: | [debbugs-tracker] bug#28056: closed (Substitution doing global when it should not.) |
Date: | Fri, 11 Aug 2017 22:40:03 +0000 |
Your message dated Fri, 11 Aug 2017 17:39:27 -0500 with message-id <address@hidden> and subject line Re: bug#28056: Substitution doing global when it should not. has caused the debbugs.gnu.org bug report #28056, regarding Substitution doing global when it should not. to be marked as done. (If you believe you have received this mail in error, please contact address@hidden) -- 28056: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=28056 GNU Bug Tracking System Contact address@hidden with problems
--- Begin Message ---Subject: Substitution doing global when it should not. Date: Fri, 11 Aug 2017 16:04:03 -0400 address@hidden ~/test $ sed --versionsed (GNU sed) 4.4Copyright (C) 2017 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.Written by Jay Fenlason, Tom Lord, Ken Pizzini,and Paolo Bonzini.GNU sed home page: <http://www.gnu.org/software/sed/>.General help using GNU software: <http://www.gnu.org/gethelp/>.E-mail bug reports to: <address@hidden>.address@hidden ~/test $ wget "https://hg.phoenixviewer.com/phoenix-firestorm-lgpl/raw-file/9d58c58cca90/indra/cmake/BuildVersion.cmake"<snipped>2017-08-11 15:39:45 (38.2 MB/s) - ‘BuildVersion.cmake’ saved [3605/3605]address@hidden ~/test $ sed -e 's:COMMAND ${MERCURIAL}:COMMAND ${MERCURIAL} --cwd ${CMAKE_SOURCE_DIR}:' BuildVersion.cmake > BuildVersion1.cmakeaddress@hidden ~/test $ sed -e 's:COMMAND ${MERCURIAL}:COMMAND ${MERCURIAL} --cwd ${CMAKE_SOURCE_DIR}:g' BuildVersion.cmake > BuildVersion2.cmakeaddress@hidden ~/test $ diff -u BuildVersion1.cmake BuildVersion2.cmakeaddress@hidden ~/test $ diff -u BuildVersion.cmake BuildVersion1.cmake--- BuildVersion.cmake 2017-08-11 15:39:45.639970357 -0400+++ BuildVersion1.cmake 2017-08-11 15:40:47.646763237 -0400@@ -25,10 +25,10 @@# building an earlier revision. Instead, we use# "hg identify -n" to get the local revision number# of the actual state of the repository.- #COMMAND ${MERCURIAL} log -r tip:0 --template '\\n'+ #COMMAND ${MERCURIAL} --cwd ${CMAKE_SOURCE_DIR} log -r tip:0 --template '\\n'#COMMAND ${WORDCOUNT} -l#COMMAND ${SED} "s/ //g"- COMMAND ${MERCURIAL} identify -n+ COMMAND ${MERCURIAL} --cwd ${CMAKE_SOURCE_DIR} identify -nCOMMAND ${SED} "s/+//" # [CR] Strip off any + from the revision numberOUTPUT_VARIABLE VIEWER_VERSION_REVISIONOUTPUT_STRIP_TRAILING_WHITESPACEThe only difference in the sed commands was s/// and s///g. The diff between BuildVersion1.cmake and BuildVersion2.cmake should had one change. But sed is matching two lines without the s///g. All docs I have read says that without 'g', only the first match is changed. However, this is not in my case and was not notice for over two years due to my build script not breaking. I only notice this bug when I was doing some code cleanup and scratching my head as to why my build script was not breaking when in theory, it should had an error printed when hg could not see the repo.
--- End Message ---
--- Begin Message ---Subject: Re: bug#28056: Substitution doing global when it should not. Date: Fri, 11 Aug 2017 17:39:27 -0500 User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 tag 28056 notabug thanks On 08/11/2017 03:04 PM, Techwolf Lupindo wrote: > address@hidden ~/test $ sed -e 's:COMMAND ${MERCURIAL}:COMMAND > ${MERCURIAL} --cwd ${CMAKE_SOURCE_DIR}:' BuildVersion.cmake > > BuildVersion1.cmake > address@hidden ~/test $ sed -e 's:COMMAND ${MERCURIAL}:COMMAND > ${MERCURIAL} --cwd ${CMAKE_SOURCE_DIR}:g' BuildVersion.cmake > > BuildVersion2.cmake > > The only difference in the sed commands was s/// and s///g. Which tells sed whether to make one substitution on every affected line, or as many substitutions as possible on every affected line. But the number of affected lines remains unchanged for the two variants. > The diff > between BuildVersion1.cmake and BuildVersion2.cmake should had one change. Rather, one change per affected line. > But sed is matching two lines without the s///g. All docs I have read says > that without 'g', only the first match is changed. Only the first match per line - but when both lines affected only had one match per line, there's no difference in using the 'g' flag. If you want sed to stop processing as soon as it has changed one line, rather than going on to look for additional affected lines, you can do so: sed -e '/COMMAND ${MERCURIAL}/ { s::COMMAND ${MERCURIAL} -- cwd ${CMAKE_SOURCE_DIR}: ; q }' which says find the first line that matches the pattern, and on that line make the substitution and immediately quit. Since sed is behaving as documented, I'm closing this as not a bug; however, feel free to add further comments to this thread if you need followup clarification. -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.orgsignature.asc
Description: OpenPGP digital signature
--- End Message ---
[Prev in Thread] | Current Thread | [Next in Thread] |