如何移动第一行包含字符串的文件?

时间:2019-03-06 13:46:44

标签: linux bash centos redhat

我当前正在使用以下命令:

grep -l -Z -E '.*?FindMyRegex' /home/user/folder/*.csv | xargs -0 -I{} mv {} /home/destination/folder

这很好。问题在于它在整个文件上使用grep

我只想在文件的第一行上使用grep命令。

我一开始尝试使用head -1 file |,但是没有用。

6 个答案:

答案 0 :(得分:1)

我要添加到脚本中的更改是-

     for file in *.csv; do 
        head -1 "$file" | grep -l -Z -E '.*?FindMyRegex' | xargs -0 -I{} mv {} /home/destination/folder; 
     done

答案 1 :(得分:0)

您也许可以尝试sed '1q' file.csv | grep ...仅在第一行中搜索正则表达式。

答案 2 :(得分:0)

gawk 'FNR==1{if($0~/PATTERN/)
    printf "mv %s %s\n",FILENAME, "/target";nextfile}' /path/*.csv
  • 首先,在您的正则表达式中:.*?FindMyRegex .*?没有任何意义,可以将其删除。
  • 上面的awk(gawk)单行代码将为您建立mv file target命令行。您可以检查它们,如果对它们满意,则将输出通过管道传递到|sh,将执行命令。

  • 用正则表达式模式替换PATTERN,用实际目标目录替换/target

  • 一种情况是假设文件名不包含特殊字符(即空格),如果是,请将" s添加到mv cmd中。

  • p>

答案 3 :(得分:0)

您不需要grepfind,只要您的文件没有嵌入换行符即可。
我不知道让sed用空值定界的简单方法。

mv $( for f in  /home/user/folder/*.csv;
      do sed -ns '1 { /yourPattern/F; q; }' $f;
      done ) /home/destination/folder/
  

编辑

用循环重写。这将运行sed的单独实例来检查每个文件,但是至少不应在第一行之外读取它。如果没有匹配,则 会在语法上失败。

可能需要-E,具体取决于您的正则表达式。

-n说不要从文件中打印记录。
-s说,将每个文件都当作一个单独的输入-这样文件名并不总是第一个。

确实需要sed使用GNU F

答案 4 :(得分:0)

使用GNU awk查找文件名,将文件名通过管道传递到xargs

<s:form action="RegTeacher" method="Update" theme="simple" >

如果看起来还可以,请删除“回声”

答案 5 :(得分:0)

尝试使用Shellcheck干净的Bash代码:

#! /bin/bash

shopt -s nullglob   # Globs that match nothing expand to nothing
shopt -s dotglob    # Globs match files whose names start with '.'

dest=/home/destination/folder

for file in *.csv ; do
    head -n 1 -- "$file" | grep -qE '.*?FindMyRegex' && mv -- "$file" "$dest"
done
    如果目录中没有shopt -s nullglob个文件,
  • .csv可以防止错误。
  • shopt -s dotglob确保名称以“。”开头的文件。被处理。
  • --head选项中的mv确保正确处理名称以-开头的文件。
  • "$file""$dest"中的引号确保正确处理包含空格(实际上为$IFS)字符(包括换行符)或glob元字符的名称。

请注意,规则表达式中的.*?可能是多余的,并且可能无法执行您认为的操作(grep -E不会进行非贪婪匹配)。