shell循环匹配当前行中的正则表达式

时间:2012-01-26 14:22:19

标签: shell sed grep

我正在尝试创建一个脚本来修复这样的csv文件:

field_one,field_two,field_three
,field_two,field_three

所以我需要检查我的循环内部,如果当前行缺少field_one并用sed替换为field_one的新值(覆盖缺少field_one的行)。

为此,我有一个循环,但我需要一些帮助,以确定该行是否缺少第一个字段。我应该用grep?但如何在循环中使用它并得到它的响应?

while read -r line; do  
    # this is pseudocode:
    # if $line matches regex then
         #  sed 's/,/newfieldone/'
         #  overwrite the corrected line in the file
    # end if
done < my_file

非常感谢您的帮助!!!!

11 个答案:

答案 0 :(得分:3)

在循环中,您可以运行以下sed命令:

sed 's/^\s*,/newfieldone,/'

答案 1 :(得分:2)

要查看某行是否以,开头,因此缺少字段1,您可以使用if [[ "$line" =~ ^, ]]

例如:

while read -r line; do  
  if [[ "$line" =~ ^, ]]
  then
    echo "newfieldone$line"
  else
    echo "$line"
  fi
done < my_file

答案 2 :(得分:2)

只是为了它,这是awk的解决方案:

awk '{FS=","} {if ($1 == "") print "field_one" $0;else print $0} ' < /tmp/test.txt

答案 3 :(得分:1)

sed -i 's/^,/fieldone,/' YOURFILE

将使用,替换以fieldone,开头的每一行(就地,因此原始文件会被覆盖,如果您需要备份,请尝试-i.backup)。

如果你想要一个动态的fieldone值,那么它取决于它是多么动态:-),例如:

MYDYNAMICFIELDONE="DYNAF1"
sed -i "s/^,/${MYDYNAMICFIELDONE},/" YOURFILE

或使用while循环:

while read -r line; do  
    MYDYNAMICFIELDONE="SET IT"
    sed -i "s/^,/${MYDYNAMICFIELDONE},/"
done < my_file > tmpfile
mv tmpfile my_file

awk

awk '{
       /^,/ { 
               DYNAF1="SET IT HERE"
               print gensub("^,",DYNAF1 ",","g",$0)
            }
      } INPUT > OUTPUT

答案 4 :(得分:1)

$ sed -e "/^,/s/^,\([^,]*\),\([^,]\)/new_field_one,\1,\2/" < my_file

编辑:这可能太复杂了。采取其他一个好的答案:)

答案 5 :(得分:1)

这可能对您有用:

a=Field_one,Field_two,Field_three
sed '/^,/c\'$a'' file
field_one,field_two,field_three
Field_one,Field_two,Field_three

或者只是插入field_one

a=Field_one
sed '/^,/s/^/'$a'/' file
field_one,field_two,field_three
Field_one,field_two,field_three

答案 6 :(得分:1)

用sed尝试类似的东西:

sed -i 's|\(^,.*\)|new_field_one\1|g' <your file>

答案 7 :(得分:1)

使用case语句的简单bash解决方案:

while read -r line; do  
  case "$line" in
    ,*) printf "%s%s\n" newfieldone "$line" ;;
    *)  printf "%s\n" "$line" ;;
  esac
done < my_file

case使用“glob”匹配,而不使用正则表达式,因此,*匹配以逗号开头的字符串。

答案 8 :(得分:1)

这是一个非常简短的1-liner awk

awk '{$1="field_one"}1' FS=',' OFS=',' file.csv

答案 9 :(得分:1)

。 。 。和另一个awk单行:

awk '$1==""{$1="field_one"}1' FS=',' OFS=',' file

答案 10 :(得分:0)

仅使用bash怎么样?

while IFS=\, read field_one field_two rest_of_line
  echo "${field_one:-default_field_one_value},$field_two,$rest_of_line"
doen < my_file > my_corecct_file

如果'field_one'为空,则使用'default_field_one_value'