Awk 从Mercurial repo中删除所有本地书签
Awk 从Mercurial repo中删除所有本地书签,awk,mercurial,Awk,Mercurial,hg bookmarks--delete可用于删除书签 有没有办法通过bash脚本删除Mercurial回购协议中的所有书签?我认为这可能是可能的使用awk-但它有点超越我 hg书签的输出格式为(例如): 我需要得到的只是: 2018.02.706 Customer App 2018.02.707 Customer App 这将删除最后一个字段: awk 'NF{NF--}1' file 这只是将最后一个字段设置为“无”: awk '{$NF=""}1' file 这将删除最后一个字段:
hg bookmarks--delete
可用于删除书签
有没有办法通过bash脚本删除Mercurial回购协议中的所有书签?我认为这可能是可能的使用awk-但它有点超越我
hg书签的输出格式为(例如):
我需要得到的只是:
2018.02.706 Customer App
2018.02.707 Customer App
这将删除最后一个字段:
awk 'NF{NF--}1' file
这只是将最后一个字段设置为“无”:
awk '{$NF=""}1' file
这将删除最后一个字段:
awk 'NF{NF--}1' file
这只是将最后一个字段设置为“无”:
awk '{$NF=""}1' file
考虑到前面的回复中的帮助,下面是我用来删除mercurial书签的完整脚本:
hg bookmarks | awk 'NF' | awk 'sub($NF,"")' | awk '{print "hg bookmarks --delete \047" $0 "\047"}' > clear-bookmarks.sh
如果要确保删除前导空格和尾随空格,请使用以下命令:
hg bookmarks | awk 'NF' | awk 'sub($NF,"")' | awk '{ gsub(/^[ \t]+|[ \t]+$/, ""); print }' | awk '{print "hg bookmarks --delete \047" $0 "\047"}' > clear-bookmarks.sh
我的脚本编写经验无论如何都不是很好——但它似乎很管用 考虑到前面回复中的帮助,下面是我用来删除mercurial书签的完整脚本:
hg bookmarks | awk 'NF' | awk 'sub($NF,"")' | awk '{print "hg bookmarks --delete \047" $0 "\047"}' > clear-bookmarks.sh
如果要确保删除前导空格和尾随空格,请使用以下命令:
hg bookmarks | awk 'NF' | awk 'sub($NF,"")' | awk '{ gsub(/^[ \t]+|[ \t]+$/, ""); print }' | awk '{print "hg bookmarks --delete \047" $0 "\047"}' > clear-bookmarks.sh
我的脚本编写经验无论如何都不是很好——但它似乎很管用 假设输入中的空格与示例输入中的空格一样是空白字符,要方便、可靠地完成问题中的要求,需要:
$ sed 's/ [^ ]*$//' file
2018.02.706 Customer App
2018.02.707 Customer App
要获得输出,命令行将生成:
$ sed 's/\(.*\) .*$/hg bookmarks --delete '\''\1'\''/' file
hg bookmarks --delete '2018.02.706 Customer App'
hg bookmarks --delete '2018.02.707 Customer App'
如果您有使用awk的强烈愿望,那么:
$ awk '{sub(/ [^ ]+$/,"")}1' file
2018.02.706 Customer App
2018.02.707 Customer App
$ awk '{sub(/ [^ ]+$/,""); print "hg bookmarks --delete \047" $0 "\047"}' file
hg bookmarks --delete '2018.02.706 Customer App'
hg bookmarks --delete '2018.02.707 Customer App'
如果示例中的空白可以不是一个空白字符,请将/[^]+$/
替换为/[:space:][]+[^[:space:][]+$/
。假设输入中的空格与示例输入中的空格一样是空白字符,则可移植且可靠地执行问题中的要求是:
$ sed 's/ [^ ]*$//' file
2018.02.706 Customer App
2018.02.707 Customer App
要获得输出,命令行将生成:
$ sed 's/\(.*\) .*$/hg bookmarks --delete '\''\1'\''/' file
hg bookmarks --delete '2018.02.706 Customer App'
hg bookmarks --delete '2018.02.707 Customer App'
如果您有使用awk的强烈愿望,那么:
$ awk '{sub(/ [^ ]+$/,"")}1' file
2018.02.706 Customer App
2018.02.707 Customer App
$ awk '{sub(/ [^ ]+$/,""); print "hg bookmarks --delete \047" $0 "\047"}' file
hg bookmarks --delete '2018.02.706 Customer App'
hg bookmarks --delete '2018.02.707 Customer App'
如果您的示例中的空白不是一个空白字符,请将/[^]+$/
替换为/[:space:][]+[^[:space:][]+$/
。我认为(有一些可能需要的更正)将比awk更简单、更自然:纯水银,没有什么比我认为(有一些可能需要的更正)将比awk ing更简单、更自然:纯Mercurial,仅此而已如果您真的只想删除所有书签,只需从repo的隐藏.hg
目录中删除.hg/bookmarks
文件即可
如果您从远程位置拉出书签,书签可能会返回,因此您还必须执行hg book push-B“您的书签名称”
,才能从远程位置删除书签,但这是任何其他删除书签的方法都会遇到的问题。如果您真的只想删除所有书签,只需从repo的隐藏.hg
目录中删除.hg/bookmarks
文件
如果您从远程位置拉出书签,书签可能会返回,因此您还必须执行hg book push-B“您的书签名称”
,才能从远程位置删除书签,但这是任何其他删除书签的方法都会遇到的问题。或awk'NF--“文件”
@Cyrus不能使用,在空行中,您将看到此消息awk:cmd。第1行:(FILENAME=t FNR=4)致命:NF设置为负值
。这就是为什么您应该将最后一个字段设置为空,或者测试NF是否为真>0
,然后减去1
是,在这种情况下,这将是一个问题。感谢您指出这一点。第一个(NF--
)依赖于未定义的行为,因此它在awk版本之间的作用会有所不同。或者不能使用awk'NF--'文件
@Cyrus,在空行中您会收到此消息awk:cmd。第1行:(FILENAME=t FNR=4)致命:NF设置为负值
。这就是为什么您应该将最后一个字段设置为空,或者测试NF是否为真>0
,然后减去1
是,在这种情况下,这将是一个问题。感谢您指出这一点。第一个(NF--
)依赖于未定义的行为,因此它的作用在awk版本之间会有所不同。为了完整起见,我使用了一个脚本来删除hg书签(它还修剪了开头和结尾的空格):hg书签| awk'NF'| awk'sub($NF,“”)| awk'{gsub(/^[\t]+\t]+$/,“);print}'| awk'{print“hg书签--删除\x27“$0”\x27}'>清除书签。sh@dubs我会说,作为一个新的答案,它比其他答案更完整。如果$NF
包含RE元字符,那么这将失败。避免在regexp或替换文本中使用输入数据,除非执行某些特定任务需要输入数据$NF=“”
或sub(/[^[:space:]+$/,”)
会更有力地完成同样的事情,但它们仍然会像当前的解决方案一样在每行末尾留下尾随空格。为了完整起见,我使用了一个脚本来删除hg书签(它还会修剪前导和结尾的空格):hg bookmarks | awk'NF'| awk'sub($NF,”)| awk'{gsub(/^[\t]+|[\t]+$/,“”);print}| awk'{print“hg bookmarks--删除\x27“$0”\x27”}清除书签。sh@dubs我会说,作为一个新的答案,它比其他答案更完整。如果$NF
包含RE元字符,那么这将失败。避免在regexp或替换文本中使用输入数据,除非执行某些特定任务需要输入数据$NF=“”
或sub(/[^[:space:]+$/,”)
将更有力地完成同样的任务,但它们仍会像当前解决方案那样在每行末尾留下尾随空格。您不需要多个管道和对awk的调用来完成这些代码行将要完成的任务,如果给定$NF
的某些值,它们将失败,您应该使用八进制而不是十六进制来获取”
s,请参见。@EdMorton我不确定如何减少p的数量