2

我正在尝试从文件中删除特定行,然后将编辑后的行附加到文件中。我得到了最后一部分,但是我删除旧行的 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 的上述脚本后,这是输出

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  
4

4 回答 4

1

在这种情况下,您需要这样做,因为$意味着行尾正则表达式。

尝试:

sed "/^${userinput}/d" file1.txt >> file2.txt

>>将附加到文件中。

于 2013-03-28T02:19:31.047 回答
0

$是 sed 中的一个特殊字符,意思是“行尾”。如果您想$userinput在一行的请求中匹配文字,请使用see '/^\$userinput/d'

如果您希望您的 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
于 2013-03-28T02:32:12.340 回答
0

我确实尝试过,发现变量值没有被 sed 语句中的 shell 正确替换。所以 sed 命令不是像模式一样搜索值,而是使用变量名作为模式进行搜索

即它试图搜索 $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
于 2013-03-28T02:55:40.637 回答
0

想出了如何解决它。

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   

命令

注意上面的解释与上面使用的实际代码不匹配,因为我认为查看这封信的人会更好地获得更一般的解释。我也知道可能有更好的方法来解决这个问题,并且上面的代码可能会被缩短。任何有关如何改进这一点的意见将不胜感激。感谢所有帮助过我的人。

于 2013-03-28T17:24:59.423 回答