Bash 为什么sed不从文件中删除行?
我正在尝试从文件中删除特定行,然后将编辑的行附加到文件中。最后一部分我做对了,但是我删除旧行的sed命令不起作用Bash 为什么sed不从文件中删除行?,bash,sed,Bash,Sed,我正在尝试从文件中删除特定行,然后将编辑的行附加到文件中。最后一部分我做对了,但是我删除旧行的sed命令不起作用 sed '/^$userinput/d' file1.txt > file2.txt 这会将所有文件内容添加到新文件中。而不仅仅是我想保留的台词。用户输入是我想要删除的由用户给出的行。这是我为班级做的一个BASH项目。我想通过删除该行,将其从文件中完全删除 sed "/^${1}$/d" file > otherfile 这将添加所有需要和不需要的行 sed "/
sed '/^$userinput/d' file1.txt > file2.txt
这会将所有文件内容添加到新文件中。而不仅仅是我想保留的台词。用户输入是我想要删除的由用户给出的行。这是我为班级做的一个BASH项目。我想通过删除该行,将其从文件中完全删除
sed "/^${1}$/d" file > otherfile
这将添加所有需要和不需要的行
sed "/^$1/d" file > otherfile
创建空文件
这是我正在处理的声明。最后把它粘进去
update(){
read -p "Enter the course number of the course you would like to update: " updateInput
grep $updateInput my_course.txt>update.txt
typeset -i status
typeset grade
if [ $? -eq 0 ]
then
read -p "Status: " status
while(true)
do
if [ $status -eq 0 ]
then
break
elif [ $status -eq 1 ]
then
break
else
printf "Enter either a 0 or 1\n"
fi
done
read -p "Grade: " grade
while(true)
do
if [ $status -eq 0 ]
then
break
elif [ $status -eq 1 ]
then
break
else
printf "Enter either a 0 or 1\n"
fi
done
read -p "Grade: " grade
while(true)
do
case $grade in
A)
break
;;
B)
break
;;
C)
break
;;
*)
read -p "Enter either an A, B, C: " grade
;;
esac
done
sed "/^$updateinput/d" my_course.txt>my_course1.txt
awk -F, '
/^CSC/{printf$1","$2","$3"," > "update1.txt"}' update.txt
printf $status","$grade >> update1.txt
cat my_course1.txt > my_course.txt
cat update1.txt >> my_course.txt
rm update.txt
rm update1.txt
fi
}
我很抱歉没有早点发布。每次我试着把它粘贴进去,都会告诉我有错误
在文件中放置两行文本并调用上述脚本(状态为1,等级为A)后,这就是te输出
CSC3320,系统级编程,3,1,A
这本质上就是修改文件的脚本。在函数的开头添加grep
grep $updateInput my_course.txt>update.txt (This is at the beginning of the function. Everything else was at the bottom. )
sed "/^$updateinput/d" my_course.txt>my_course1.txt
awk -F, '
/^CSC/{printf$1","$2","$3"," > "update1.txt"}' update.txt
printf $status","$grade >> update1.txt
cat my_course1.txt > my_course.txt
cat update1.txt >> my_course.txt
rm update.txt
rm update1.txt
在这种情况下,您需要这样做,因为
$
表示行末正则表达式
尝试:
另外,
>
将附加到文件。$
是sed中的一个特殊字符,表示“行尾”。如果要在行间匹配文本$userinput
,请使用参见“/^\$userinput/d”
grep regexexperssion file1>file3
如果希望shell用变量的内容替换变量$userinput
,请使用双引号而不是单引号:
sed "/^$userinput/d" file1.txt > file2.txt
或者更好
sed "/^${userinput}/d" file1.txt > file2.txt
这将删除以${userinput}
值开头的行,如果只想删除与${userinput}
值完全相同的行,请使用
sed "/^${userinput}$/d" file1.txt > file2.txt
为我工作:
╰─ ☭ cat file
bar
foobar
foo
asdf
qwer
foo
asdf
╰─ ☭ cat script.sh
#!/bin/bash
sed "/^${1}$/d" file > otherfile
╰─ ☭ ./script.sh foo
╰─ ☭ cat otherfile
bar
foobar
asdf
qwer
asdf
我试过了,发现sed语句中的shell没有正确地替换变量值。 因此sed命令不是像模式那样搜索值,而是用变量名作为模式进行搜索 ie试图搜索$userinput作为模式@EOL 这是由于单引号的存在,请再次尝试您的命令,但将其替换为双引号:它在我的系统中起作用 代码::
Nitin@Kaizen ~> cat new
#!/bin/bash
echo "the input file :"
cat INPUT2.txt ;
echo "enter line to remove" ;
read rem ;
date >> sed.log ;
sed "/$rem/d" INPUT2.txt >> sed.log;
echo "the output file :" ;
cat sed.log;
运行::
Nitin@Kaizen ~ > ./new
the input file :
aa1
chap1
mk.t
temp.txt
z1
z2
enter line to remove
temp.txt
the output file :
Thu Mar 28 08:18:07 IST 2013
aa1
chap1
mk.t
z1
z2
找到了解决办法
update(){
read -p "Enter the course number of the course you would like to update: " updateInput
grep -v ^$updateInput my_course.txt>updatedfile.txt
grep ^$updateInput my_course.txt>editedline.txt
if [ $? -eq 0 ]
then
while(true)
do
read -p "Status: " status
if [ $status -eq 0 ]
then
break
elif [ $status -eq 1 ]
then
break
else
printf "Enter either a 0 or 1\n"
fi
done
read -p "Grade: " grade
while(true)
do
case $grade in
A)
break
B)
break
;;
C)
break
;;
*)
read -p "Enter either an A, B, C: " grade
;;
esac
done
awk -F, '
/^CSC/{printf$1","$2","$3"," >> "updatedfile.txt"}' editedline.txt
printf $status","$grade"\n" >> updatedfile.txt
cat updatedfile.txt > my_course.txt
rm updatedfile.txt
rm editedline.txt
else
printf "This course doesn't exist in your courses list.\n"
fi
}
在我使用的代码的开头
grep -v regexexperssion file1>file2
获取文件中的所有行,但不删除要删除的行。然后我使用grep从文件中获取要编辑的实际行
grep regexexperssion file1>file3
在awk的底部,我使用file3中的行上的用户生成的变量执行编辑,然后将其附加到file1,该文件是使用
grep -v regexexpression file1>file2
命令
注意:上面的解释与上面使用的实际代码不匹配,因为我认为人们最好查看这封信以获得更一般的解释。我也知道可能有更好的方法来解决这个问题,上面的代码可能会被缩短。任何关于如何改进的意见都将不胜感激。感谢所有帮助我的人 我不想替换为一个变量,我想完全删除该行$userinput是用户想要删除的行。哦,如果您从用户处读取该行,那么这与存储在变量中的变量的情况相同,对吗?是的,从用户处读取的行是放入$userinput中的内容,然后用于在文件中搜索要读取的行delete@user2127364你能用什么不起作用来更新这个问题吗?这在我写的一个小脚本中对我有效。那也不起作用。出于某种奇怪的原因,它可以在命令行上运行,但不能在bash脚本文件中运行。这也不起作用。它没有删除一行,也没有像添加所有行(需要和不需要的行)之前那样,在文件中打印任何内容。只是在文件中添加空文本sed可能不起作用,这种情况曾经发生过一次——您是否可以在脚本中添加set-xv,并在shell执行sed语句之前检查变量值是否被替换?您应该看到如下内容::sed命令
sed”/$rem/d“INPUT2.txt>>sed.log
将扩展为::++sed/temp.txt/d INPUT2.txt
在执行之前,请发布一个复制问题的脚本的最小示例。