Linux 简单sed代换

Linux 简单sed代换,linux,sed,awk,csh,Linux,Sed,Awk,Csh,我有一个文本文件,其中包含结构为ABC123456A或ABC123456AA的文件列表。我想做的是检查ABC123456ZZP文件是否也存在。i、 e我想用ZZP替换ABC123456之后的字母 我可以用sed这样做吗 X=ABC123456 ; echo ABC123456AA | sed -e "s,\(${X}\).*,\1ZZP," 像这样 X=ABC123456 ; echo ABC123456AA | sed -e "s,\(${X}\).*,\1ZZP," 您可以按照wil

我有一个文本文件,其中包含结构为ABC123456A或ABC123456AA的文件列表。我想做的是检查ABC123456ZZP文件是否也存在。i、 e我想用ZZP替换ABC123456之后的字母

我可以用sed这样做吗

X=ABC123456 ;  echo ABC123456AA | sed -e "s,\(${X}\).*,\1ZZP,"
像这样

X=ABC123456 ;  echo ABC123456AA | sed -e "s,\(${X}\).*,\1ZZP,"

您可以按照wilx的建议使用sed,但我认为更好的选择是bash

while read file; do
    base=${file:0:9}
    [[ -f ${base}ZZP ]] && echo "${base}ZZP exists!"
done < file
读取文件时
;做
base=${file:0:9}
[[-f${base}ZZP]]&&echo“${base}ZZP存在!”
完成<文件
这将循环文件中的每一行 然后将base设置为行的前9个字符(不包括空格)
然后检查底部是否存在ZZP文件,如果存在,则打印消息。

您可以按照wilx的建议使用sed,但我认为更好的选择是bash

while read file; do
    base=${file:0:9}
    [[ -f ${base}ZZP ]] && echo "${base}ZZP exists!"
done < file
读取文件时
;做
base=${file:0:9}
[[-f${base}ZZP]]&&echo“${base}ZZP存在!”
完成<文件
这将循环文件中的每一行 然后将base设置为行的前9个字符(不包括空格) 然后检查底部是否存在ZZP文件,如果存在,则打印消息。

查看:

$ str="ABC123456AA"
$ echo "${str%[[:alpha:]][[:alpha:]]*}"
ABC123456
这样做:

while IFS= read -r tgt; do
    tgt="${tgt%[[:alpha:]][[:alpha:]]*}ZZP"
    [[ -f "$tgt" ]] && printf "%s exists!\n" "$tgt"
done < file
它将比sed解决方案更高效、更健壮,并且在这两种情况下都与其他shell解决方案相似。

看:

$ str="ABC123456AA"
$ echo "${str%[[:alpha:]][[:alpha:]]*}"
ABC123456
这样做:

while IFS= read -r tgt; do
    tgt="${tgt%[[:alpha:]][[:alpha:]]*}ZZP"
    [[ -f "$tgt" ]] && printf "%s exists!\n" "$tgt"
done < file


它将比sed解决方案更高效、更健壮,并且在这两种情况下都与其他shell解决方案类似。

正是这一点。非常感谢这是一种错误的方法,因为它效率低下,并且对于不同的文件名都会失败。文件名是自动生成的,格式相同:3个字母后跟2个数字(年份),然后是4个数字,从0000增加到9999。后面的字母可能会有所不同,但只要我能访问前9个字符,它们就不那么重要了。要正确地使用它们,请参见@peteches或我的回复。管道到sed是一种错误的方法,充其量它的效率低于普通shell解决方案,如果您真的想管道到某个地方以获得前9个字符,只需管道到
cut-c1-9
,因为这将比使用sed更高效、更健壮。但我还是不会这么做,因为贝壳的内置物工作得很好。就是这个。非常感谢这是一种错误的方法,因为它效率低下,并且对于不同的文件名都会失败。文件名是自动生成的,格式相同:3个字母后跟2个数字(年份),然后是4个数字,从0000增加到9999。后面的字母可能会有所不同,但只要我能访问前9个字符,它们就不那么重要了。要正确地使用它们,请参见@peteches或我的回复。管道到sed是一种错误的方法,充其量它的效率低于普通shell解决方案,如果您真的想管道到某个地方以获得前9个字符,只需管道到
cut-c1-9
,因为这将比使用sed更高效、更健壮。不过,如果shell内置程序工作正常,我还是不会这么做。对于包含空格、反斜杠、,因此,虽然它可能适用于OPs示例,但一般来说是错误的。一般来说,这需要一个专用函数来清理路径,以确保转义元字符、空格和其他奇怪的内容,但当您获得特定格式的文件名时,这将是不成功的。您不需要专用函数,只需使用“read”的正确形式(
IFS=read-r
)。这样做并不难,而且不会让你以后自食其果。对于包含空格、反斜杠、,因此,虽然它可能适用于OPs示例,但一般来说是错误的。一般来说,这需要一个专用函数来清理路径,以确保转义元字符、空格和其他奇怪的内容,但当您获得特定格式的文件名时,这将是不成功的。您不需要专用函数,只需使用“read”的正确形式(
IFS=read-r
)。这样做并不是很难做到,也不会让你以后自食其果。我一直在等待你的
awk
解决方案:)awk是一个处理文本的工具,而不是用来操纵(例如测试是否存在)文件的工具,而操纵进程正是shell的功能所在。显然,你可以用awk代替cut,但cut是一个更好的工具。很抱歉让你失望:-)。我已经回答了这个问题,但我相信你可以用几行字来完善这个问题。我觉得它很脏,但它起作用了。看一看我刚刚在那里发布了一个答案。我一直在等待你的
awk
解决方案:)awk是一个用于处理文本的工具,而不是用于操纵(例如,测试是否存在)文件的工具,而操纵进程正是shell的功能所在。显然,你可以用awk代替cut,但cut是一个更好的工具。很抱歉让你失望:-)。我已经回答了这个问题,但我相信你可以用几行字来完善这个问题。我觉得它很脏,但它起作用了。看一看,我刚刚在那里贴了一个答案。