Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何仅当bash中存在头文件时才从文件中删除头文件?_Linux_Bash_Shell_Sed - Fatal编程技术网

Linux 如何仅当bash中存在头文件时才从文件中删除头文件?

Linux 如何仅当bash中存在头文件时才从文件中删除头文件?,linux,bash,shell,sed,Linux,Bash,Shell,Sed,我有这个样本文件。我只想在使用bash时删除该文件的第一行(头) id name job_id 1 john 25 2 adam 45 3 paul 75 您可以使用sed使用-i选项在一次操作中完成此操作(假设您的sed版本支持此操作-并非所有版本都支持)。例如: sed -i.bak -e '1{/^id name job_id/d;}' file 这将获取文件的第1行,并将大括号中的命令应用于该行。大括号搜索显示的图案并删除该线。如果第一行不匹配,则不会将其删除。其他线路保持不变 Ma

我有这个样本文件。我只想在使用bash时删除该文件的第一行(头)

id name job_id
1 john 25
2 adam 45
3 paul 75

您可以使用
sed
使用
-i
选项在一次操作中完成此操作(假设您的
sed
版本支持此操作-并非所有版本都支持)。例如:

sed -i.bak -e '1{/^id name job_id/d;}' file
这将获取文件的第1行,并将大括号中的命令应用于该行。大括号搜索显示的图案并删除该线。如果第一行不匹配,则不会将其删除。其他线路保持不变

Mac OS X
sed
必须使用分号和备份后缀;使用GNU
sed
,可以省略其中一个或两个

sed '/id name job_id/d' fileName

编辑:如果头文件存在,则仅检查第一行并在新文件中打印其余部分。否则,原稿将保持不变。

您也可以使用awk执行此操作:

awk 'NR!=1||$0!="id name job_id" {print $0}' file > newfile

这将删除它,即使它不是第一行。是的,此答案不正确,请删除它。虽然它可能会起作用,但解决方案不应该对文件的内容进行假设,而将此作为答案可能会误导未来的访问者。另外,使用sed已经有了一个正确的答案。这不也会删除第一行之后包含该模式的任何行吗?我在bash中尝试了它(在您的评论之后再次尝试),但它似乎工作正常。我的回答是仓促的,因为它不只是第一行,我应该这样做,但我几乎可以肯定它基本上完成了任务;如果标题重复,也会消除重复,这严格来说不是问题要求的。有一个答案是使用
sed
(目前)有两张反对票,但也有同样的问题。可以说,在过滤命令中应该有一个
-x
(也可以将临时文件重命名为原始文件)。哦,我想我出于某种原因误读了你的原始评论。是的,会的。我会修好的。
if head -1 original.txt | grep -Fxq 'id name job_id'
then tail -n+2 original.txt > newdoc.txt
fi
awk 'NR!=1||$0!="id name job_id" {print $0}' file > newfile