根据后续行缩进

时间:2015-01-20 14:53:05

标签: shell sed indentation

我需要修改某些位置的空格数。 例如:

    FixString VarString1
   VarString2
FixString VarString3
  VarString4

应该成为

   FixString VarString1
   VarString2
  FixString VarString3
  VarString4

在我的应用程序中,FixString是一个已知字符串(可以硬编码) 而VarString1,VarString2是变量字符串 重要的是,FixString之前的空格被调整为VarString之前的空格数。因此,FixString之前的空格数可以变得更多或更少。

我希望你能帮助我。 我当然可以向后解析文件,记住上一行中的缩进,如果行以&#34开头,则应用它。 * FixString" .... 但这似乎过于复杂。

我现在已经实现了Etan的想法。 它似乎适用于这个例子。我将不得不在我的实际文件上尝试...

IFS=''
MEMORY=""
while read -r line
do
  STRIPPED=$(echo $line|sed 's/^ *//g')
  if [ "${STRIPPED:0:9}" = "FixString"  ]
  then
#     echo $line
MEMORY=$line
  else
NUM=$(echo $line | sed 's/^\( *\).*$/\1/g')
if [ ! -z $MEMORY ]
then
  echo -n $NUM
  echo $MEMORY | sed 's/^ *//g'
fi
echo $line
MEMORY=""
  fi
done < test.txt

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

sed -r '/FixString/{N;s/^\s*(.*\n)(\s*)/\2\1\2/}' test.txt

即,搜索 FixString /FixString/),将下一行追加到模式空间(N),在第一个空格后捕获字符串({{1} })直到换行符并在换行符后捕捉空格((.*\n))。之后用第二行开头的空格((\s*))+第一行的其余字符串(包括换行符\2)+替换空格(\1 )。