【问题标题】:Remove a line from file that starts with a number in bash从文件中删除以 bash 中的数字开头的行
【发布时间】:2018-06-08 14:26:54
【问题描述】:

我正在尝试在 bash 中创建一个简单的 CSV 编辑器,
我挣扎着移除一条线。用户传入
的ID 要删除的行(每一行都用一个 ID 定义为第一列)。
这是一个示例文件结构:

ID,Name,Surname
0,Mark,Twain
1,Cristopher,Jones

因此,将 id 保存为变量并将文件名保存在另一个变量中(比如它的 file.csv),我尝试使用以下行将其从 bash 中删除:

read -p "Pass the object's ID: " idtoremove
fname=file.csv
sed -i -e "'/^$idtoremove*,/d'" $fname

但是,这对文件没有影响。这条线有什么问题?

另外,如何用变量中的字符串替换以给定 ID 开头的行?这是我将不得不面对的另一个问题,但我不知道如何解决这个问题。

【问题讨论】:

  • 您为什么在sed 命令周围同时使用双引号和单引号?这不会导致sed 失败并显示错误消息吗?
  • * 的目的是什么?

标签: regex bash csv parsing sed


【解决方案1】:

以下脚本可以帮助您。它要求用户输入一个 id。

cat script.ksh
echo "Please enter the id to be removed:"
read value
awk -v val="$value" -F, '$1!=val'  Input_file

如果您想将输出保存到 Input_file 本身,请在上面的 awk 代码中添加 > tmp_file && mv tmp_file Input_file

sed

cat script.ksh
echo "Please enter the id to be removed:"
read value
sed  "/^$value,/d"  Input_file

请使用上面sed 中的sed -i.bak 选项将输出保存到Input_file 本身并备份Input_file(更改前)。

【讨论】:

  • @anubhava,非常棒的先生,现在就完成了。谢谢anubhava先生,干杯:)
  • 你为什么说 -p 是密码? man dash 告诉我:如果指定了 -p 选项并且标准输入是终端,则会打印提示。然后从标准输入中读取一行。
  • @ctac_,谢谢 ctac,对不起,我想我对另一个选项感到困惑,我删除了它,非常感谢您在这里发表评论。
【解决方案2】:

最好在awk

awk -v id="$idtoremove" -F, '$1 != id' file.csv

如果您使用的是gnu awk,那么您也可以就地保存:

awk -i inplace -v id="$idtoremove" -F, '$1 != id' file.csv

对于其他 awk 版本,请使用:

awk -v id="$idtoremove" -F, '$1 != id' file.csv > $$.csv &&
mv $$.csv file.csv

【讨论】:

    最近更新 更多