Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 从Mercurial repo中删除所有本地书签_Awk_Mercurial - Fatal编程技术网

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的数量