Bash 为什么sed不从文件中删除行?

Bash 为什么sed不从文件中删除行?,bash,sed,Bash,Sed,我正在尝试从文件中删除特定行,然后将编辑的行附加到文件中。最后一部分我做对了,但是我删除旧行的sed命令不起作用 sed '/^$userinput/d' file1.txt > file2.txt 这会将所有文件内容添加到新文件中。而不仅仅是我想保留的台词。用户输入是我想要删除的由用户给出的行。这是我为班级做的一个BASH项目。我想通过删除该行,将其从文件中完全删除 sed "/^${1}$/d" file > otherfile 这将添加所有需要和不需要的行 sed "/

我正在尝试从文件中删除特定行,然后将编辑的行附加到文件中。最后一部分我做对了,但是我删除旧行的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
在执行之前,请发布一个复制问题的脚本的最小示例。